Asm.js Gets Faster
mikejuk writes "Asm.js is a subset of standard JavaScript that is simple enough for JavaScript engines to optimize. Now Mozilla claims that with some new improvements it is at worst only 1.5 times slower than native code. How and why? The problem with JavaScript as an assembly language is that it doesn't support the range of datatypes that are needed for optimization. This is good for human programmers because they can simply use a numeric variable and not worry about the difference between int, int32, float, float32 or float64. JavaScript always uses float64 and this provides maximum precision, but not always maximum efficiency. The big single improvement that Mozilla has made to its SpiderMonkey engine is to add a float32 numeric type to asm.js. This allows the translation of float32 arithmetic in a C/C++ program directly into float32 arithmetic in asm.js. This is also backed up by an earlier float32 optimization introduced into Firefox that benefits JavaScript more generally. Benchmarks show that firefox f32 i.e. with the float32 type is still nearly always slower than native code, it is now approaching the typical speed range of native code. Mozilla thinks this isn't the last speed improvement they can squeeze from JavaScript. So who needs native code now?"
Umm, anyone who wants their code to not run substantially slower. Seriously, do you front end programmers really think nobody does numerical simulations or other performance-sensitive work? In my line of work, I'd kill for the opportunity to make my code 1.5 times faster!
Is not that it is slow (although it is..) it's that it sucks. It doesn't allow good coding practices, let alone enforce them.
Part of what I do is writing high performance code both in "native" and various scripting languages. I just completed yet another comparison for our product, looking for the best performing scripting language for a specific task. Lua with a "just in time" compiler came in first. It is *only* about x10 slower than native code produced by gcc with moderate optimization, when measured on variety of numeric benchmarks. It is considerably slower when dealing with strings and more complex data types, as expected. All other tested scripting engines were considerably behind. I'll admit that javascript was not tested, and promise to try it out. That said, a claim of "being only 1.5 times slower than native code" is something I haven't seen *any* non-native environment be able to achieve in the last 20 years or so.
The person writing the javascript engine.
Update the ecma standard to include a set of features that is meant to be used when compiling a better language (C#, C++, Java, Perl, Python, LISP, Haskell, x86 asm, MUMPS, pig-latin, etc) down to javascript so it will run in any browser at native code speed. Then I think everyone will be happy.
So who needs native code now?
For a start, anyone implementing a JavaScript engine.
In the '90s, Microsoft's distributed component platform was DCOM, and they pitched Visual Basic as the 4GL language for custom applications. So there were lots of VB developers trying to develop and use COM components. Trouble was, COM was supposed to be programming language-neutral, but the entire architecture was designed with C/C++ in mind. So VB components kinda, sorta worked, with a lot of workarounds and gotchas (for example: dual interfaces are a cool feature of COM, right? But not if you plan to support VB clients). A pretty sharp MS MVP guy named Ted Pattison wrote some books about how you could maybe get this to work.
Why do people even bother with this kind of garbage when they need high performance? Use a language that was designed for it from the get-go, with direct access to the memory heap and system calls.
The idea of compiling to JavaScript has been done a lot. Microsoft Labs had a project to take CLR codes and compile down to JavaScript. It was abandoned as too slow. I'm sure improvements to the JavaScript engines have made it more feasible. But, as noted the lack of certain native types and immutable data types (i.e. DateTime) forces a ton of static analysis to be done just to figure out that hey, that variable could be an plain integer. And it has to be conservative. Much easier to just have integers and be done with it.
If there is such an insistence on making the web an application platform for everything, then I think at some point you just have to standardize on a VM. Yes, yet another one. So, you can use Dart, JavaScript, Scheme, C#, Java, whatever there's a compiler for. Treat the DOM as core API and enjoy.
Personally, I just hope people realize that operating systems have been doing this well for years, that sandboxing isn't unique to web browsers and that "native" applications are actually a good thing.
The mobile app thing gives me a bit of hope, but it's sad that people seem unwilling to download a installer from the web from a trusted source and install it. I find it a bit strange that people are turning to the web to solve a problem that the web greatly expanded the widespread propagation of viruses and other malware.
And what people are surprised by is a bit baffling as well. A web browser isn't magic. Being impressed that you can run Doom on a modern web browser is missing the forest for a tree. I could run Doom on my computer for ages now. Me having to visit a URL to do so isn't not a major actual change nor improvement, despite the technical accomplishments that went into it.
Anybody who writes performance-sensitive code other than trivial contrived benchmarks.
What is 3/2 times slower mean? Actually 1/2 times slower, so 2 times slower? Or that if it was 1.5 times faster it would be the other thing, so it must be 2/3 as fast? But then 1 times faster would be the same, so maybe it must be 2.5 times, or 4/5 as fast? NERD RAGE
Take a compact binary encoding of a CPU instruction set, convert it to text, run it through gzip, ungzip it, translate it back to binary instructions for a CPU.
Am I the only one who is wondering what the hell is going on? Distribute a binary already!
You laugh, but I have at times been in fear that my boss was going to ask us to do our (monetary) transaction processing system in node.js
I thought silently, the day that happens is the day I resign. Some people just cannot be told.
Since asm.js isn't sugared predication, there isn't a natural formalism to make assertions (declarations) about variables such as the set of values they can take on. Not all of these assertions need to be checked at run time. Some can be used at compile time to infer the most efficient implementation for certain use cases, and even generate different implementations for different use cases.
Seastead this.
JavaScript always uses float64 and this provides maximum precision, but not always maximum efficiency.
That doesn't make too much sense to me, I thought that typed arrays have always had 32-bit floats as an option. Why should 32-bit storage (on-heap typed arrays) and 64-bit registers (scalar values) be significantly slower than 32-bit storage and 32-bit registers? I thought the performance discrepancy between singles and doubles in CPU float units disappeared a decade and a half ago? (Or are simply single-to-double loads and double-to-single stores somehow significantly slower?)
Ezekiel 23:20
Yet another one who thinks Java has anything at all to do with Javascript.
Until you get into the tens of millions of dollars, 32-bit integers are fine for counting currency down to the cent. What kind of "(monetary) transaction processing system" were you talking about?
Java != JavaScript
Firefox is falling quite behind even if it does support ASM.JS. After FF 3.6 and 4.0 I switched browsers. Firefox has improved recently with ram usage and bugs and is usable after version 13.
However even IE 8 supports multithreading and having a different thread for each tab. Chrome had this since 1.0. Webworkers require this and security requires this. Shit on a 6 core cpu I had for 3 years now I should not have +30 tabs using one damn cpu?!
Until Firefox helps spread this out and support modern standards and increase security by threading I do not care about ASM.js as I wont use a browser that supports it.
http://saveie6.com/
In theory, the text can be translated to x86, ARM, or any other 32- or 64-bit architecture, and the translator enforces some memory safety guarantees.
More 32-bit floats will fit in your CPU's data cache than 64-bit floats.
If the (admittedly stupid) last sentence of the submission hadn't been present, would you still be complaining? They're improving the speed of js by doing some interesting stuff - what's wrong with that?
denetimliserbestlik.net
Java is not IEEE compliant for floating point calculations anyway. All high performance computing that needs reliability and IEEE compliance uses either C, or specialized asm libraries.
Using Java for numerical analysis is like using a monkey to design a space shuttle.
Funny I thought Java runs on the top mainframes at the Stock Market and major institutions world wide.
http://saveie6.com/
If you want threading in Firefox, then go vote up the bugs related to Electrolysis.
Not mainframes, more clusters. All the stuff used for reconciliation and position management uses pure integer and fixed point maths. Market makers like pushing floating point numbers around, but that's just for quick profit calculations when doing the trades. At the end of the day, everything's reconciled with precise maths.
I get pissed when you hear programmers say "Oh memory is cheap, we don't need to optimize!" Yes you do. In the server world these days we don't run things on physical hardware usually, we run it in a VM. The less resources a given VM uses, the more VMs we can pack on a system. So if you have some crap code that gobbles up tons of memory that is memory that can't go to other things.
It is seriously like some programmers can't think out of the confines of their own system/setup. They have 16GB of RAM on their desktop so they write some sprawling mess that uses 4GB. They don't think this is an issue after all "16GB was super cheap!" Heck, they'll look at a server and see 256GB in it and say "Why are you worried!" I'm worried because your code doesn't get its own 256GB server, it gets to share that with 100, 200, or even more other things. I want to pack in services as efficient as possible.
The less CPU, memory, disk, etc a given program uses, the more a system can do. Conversely, the less powerful a system needs to be. In terms of a single user system, like maybe an end user computer, well it would always be nice is we could make them less powerful because that means less power hungry. If we could make everything run 1.5 times as fast, what that would really mean is we could cut CPU power by that amount and not affect the user experience. That means longer battery life, less heat, less waste, smaller devices, etc, etc.
Except duh, websites are not software, "websites" are an experience made up of literally dozens of components on servers, clients, browsers, intermediate networking equipment, routers, modems, etc that all contain software - only one small piece of which is usually written in Javascript/HTML.
Let's correct that sentence:
"Now Mozilla claims that with some new improvements it is at worst only 1.5 times slower than single threaded, non-vectorized native code."
In other words, it's only 1.5 times slower than native code that you haven't made any serious effort to optimize. Hey, I think it's great they're improving the performance of Javascript. But this is still nowhere close to what you can do in native code when you actually care about performance.
"I'm too busy to research this and form an educated opinion, but I do have time to tell everyone my uninformed opinion."
the linux kernel works on its own? none of that GNU crap or anything else? and VLC only needs QT to run?
Websites are no less than distributed applications. If you had been paying attention you would have noticed that website development has gotten a lot more rigorous than in the old days.
http://www.rootstrikers.org/
I'd wish they'd stopping slowly and painfully going through the intermediate steps and standardize the Javascript Bytecode representation. Then javascript wouldn't be any slower than native code. Even faster in some situations ( due to runtime optimizations, if the Java folks are to be believed ).
Why on earth are we still only transferring Javascript as text? It doesn't really help security. Is obfuscated Javascript any easier to read than decompiled bytecode?
I've noticed websites have gotten alot more sophisticated, and operating systems (linux included) are still a PITA to maintain. So knock scripters all you want, at least they're getting better at their jobs.
Let's just open up my handy Javascript console in Chrome...
(0.1 + 0.2) == 0.3
false
It doesn't matter how many bits you use in floating point. It is always an approximation. And in base-2 floating point, the above will never be true.
If they're saying that JavaScript is within 1.5x of native code, they're cherry-picking the results. There's a reason why people who care have a rich set of numeric datatypes.
Wait. are you talking to *me* or just making a statement? Because that's pretty much exactly what I said...
Excellent! Can mine litecoins already :-)
How about making the Canvas tag not suck?
Seriously, you can give it the most simple test (draw an image every frame, or fill a rectangle), and it will run unacceptably slow. For comparison, a simple Win32 program that changes the background color of a maximized window once per frame has very low CPU usage, but a simple Javascript program that flashes a canvas red and blue every other frame uses 100% CPU usage if the canvas is 1024x768.
Until the canvas isn't the bottleneck anymore, Javascript graphical programs will continue to suck, and no amount of ASMJS magic will help with that bottleneck.
Anti-Criminals ... aka real programmers.
float64 is not good for human programmers. You can't store even 64 bit integers in native javascript. You don't have to be a scientific programmer to need Int64. There are tons of applications where 64bit integers are used and javascript can't handle it. For example in .net DateTime ticks are a 64 bit integer type, try taking the current time in .net ticks and using it in javascript. Not wanting to know the variable type is crazy, strongly typed code is always more manageable and less prone to mistakes.
People implementing JavaScript engines. Among many other. You would instantly lament if every bit of machine code deployed in the world were suddenly to reimplement itself in your beloved JavaScript.
Signature intentionally left blank.
Java is not IEEE compliant for floating point calculations anyway. All high performance computing that needs reliability and IEEE compliance uses either C, or specialized asm libraries.
Using Java for numerical analysis is like using a monkey to design a space shuttle.
LOL, are you high? Java runs Wall Street.
The "everything must be a web site" mentality has confused the hell out of me for ages as well.
For some time I assumed it was probably for portability, but while writing a game I'm sure no one cares about I found that portability actually isn't all that difficult. The number of #ifdef involved to make it compile for both Windows and Linux (and FreeBSD, though I haven't compiled for it in about a year) amount to a very minor part of the code, and probably wouldn't have been even that much if I were more of a fan of using other people's libraries. (It does use GLFW, which no doubt is taking care of at least 95% of the portability issues for me.) I suspect even a Mac OS version wouldn't be too difficult though I never could figure out how to produce one from Linux. Granted, I don't have a reliable Linux version available due to LGPL issues, but no one cares about Linux anyway. They could certainly achieve portability between the platforms they care about (anything Windows runs on, and Mac OS) easily enough with a compiled C program, and if they really cared they could also set up a server farm of Linux machines so that they have a copy of each distribution available to compile a Linux version too.
So then why is it I go to YouTube and deal with shitty web video that barely plays correctly if it does at all? I've seen the red and blue channels reversed in video, I've seen 30-second seek times (even seeking backwards), and at times it simply doesn't work at all. The same goes for hulu.com or any online radio web site. Even Facebook could benefit from having a custom application. ...and all of these things would run more efficiently as an application than they do as a web site.
Hell, the new flickr.com is probably the best example. In their desire to have a wall of images in the search results, the javascript spends so much time examining possible arrangements of the images that the computer grinds to a halt. The web site is damn-near unusable, and certainly only "usable" if you're desperate. As far as "I'm bored so I'll look for something interesting on Flickr" goes, it's positively worse than being bored. Granted, they should do the intelligent thing and just go back to the web site they had, but as long as they're insistent on styling their image indexes like that, if they were to do it in a custom application, it could figure out the arrangements it wants in the blink of an eye and so the user experience wouldn't be so miserable.
The craziest thing about it for me is that, given the choice between making a web site and making a proper application, I'd rather make a proper application. Communicating with a server over a TCP connection is a piece of cake, so I don't need a web browser for that, nor do I want to structure everything as an HTTP request anyway. I also don't have to worry about cross-testing in every version of every web browser. Granted, you do then have to cross-test to different operating systems, but at least between Windows and Linux, I've found most of the issues that crop up tend to be data access errors that show up in one version but not the other simply due to data being arranged differently in each executable, and I haven't even seen that since compiling with -fstack-protector-all and writing a wrapper for malloc() in an effort to catch any invalid data access. With web sites I always seem to spend at least 20% of my time trying to make things look at least reasonable in every web browser, and I'm not one of those people who even tries to do fancy shit, I just keep running issues into things like one web browser inserting a blank line somewhere where another doesn't and trying to figure out some way to structure everything so that, if they can't all look the same, then at least none of them end up with ass-ugly formatting.
So I can only guess that the "everything must be a web site" is a user-driven demand.
Part of that might be the Windows convention that no matter how trivial
I was referring to you. Pardon me if I misconstrued your meaning. Since websites/applications ARE software I am not sure what you meant.
http://www.rootstrikers.org/
Instead of overgeneralizing, let's specify the subject. As was said above, "scripting isn't programming". This ignores many of the huge libraries written in scripts, such as ASM.js, which were nowhere near trivial to crap out.
A few lines of scripting isn't programming, but it qualifies as "website development". Also included is a fully separated 3-tier, pre-compiled architecture with persistence and unit tests.
Websites are frequently, way less than distributed applications. Speaking of websites as if they encompass only a part of what's true speaks of the ignorance of your experience. And I would have replied to Dahamma above but you got the mod points.
I don't see any proof of rigor in anything I have seen - I do see PHP and python, C# and jsp - all both with and without any rigor. Being compiled does not imply rigor, and being separated across N tiers does not mean rigor. I'm pretty sure you mis-typed, but the information here being general is, in general, completely without factual basis.
In fact, I would argue that more people are writing websites via programming, where they used to do the same via scripts, and with the exact same regard (or lack of) to rigor.
Yes it is, see strictfp
If you don't specify strictfp, the JVM is allowed to use higher precision data types in intermediate calculations, leading to greater precision and better performance at the expense of IEEE conformity.
If you do, you get IEEE 754 compliance.
You have to price out all the details. The question isn't what the server costs to buy. It is what it costs to buy, what support on it costs, both in terms of a warranty and sysadmin time, what physical space costs, or is available, what power and cooling cost, and what kind of reliability you need.
A "cheap" server can end up being not so cheap in many cases. A cheap server is great right up until the point where it fails, and then there is no way to fix it or restore it in a reasonable amount of time.
You can see what it costs for more realistically reliable things by looking at what VMs cost on the open market. For example Pair, who provides top notch reliability and support, wants about $1500/year for a server with 3GB RAM/80GB disk. Linode, which is much lower end particularly with regards to management, but still solid, wants about $500/year for 2GB RAM/96GB disk. These are for virtual servers, not physical systems. That gives you some idea what a server might actually cost in terms of all the things like power, cooling, bandwidth, maintenance, management, hardware refresh, backup, and so on.
That aside, if the program is for a very specific task, ok then development cost can be looked at fairly straight to server cost 1:1, if it is for resale/use elsewhere, then not so much. You can't very well try and foist off the development cost to each customer or argue they should be willing to buy a lot of hardware to support it.
I'm not saying programmers should spend man-years optimizing for every little fractional ounce of improvement (though in some cases it is worth it, read up on some of the stuff Michael Abrash has done) but that optimization does matter.
Jane Street runs OCaml! :-)
I'm sorry, but this is just wrong, and I'm sick of hearing these theories about why JavaScript must always be sloewr. There's nothing limiting to the potential back-end performance of a JavaScript VM just because of a lack of data types. If you want to get serious about execution speed, then you dynamically profile the domains and ranges of all your operations. You don't make assumptions about them. When you know what their potential ranges given the input domains, then you use as small a datatype as you can in order to get optimal performance (cache locality, memory bandwidth, as well as auto-vectorization opportunities and even table-lookups).
This is HARD WORK to do, but it is NOT impossible, NOR is it a limitation of languages lacking a rich set of numeric datatypes. In fact, once you get serious about domain/range analysis, you can potentially pull WAY AHEAD of statically compiled languages in speed, because they are stuck performing full 64-bit or 80-bit FP operations (and moving all that bloated data around) on numbers that often doesn't need even a fraction of that precision.
But in delphi it is trivially easy with an onmouseover event. And as far as I remmember some of the GUI framework and delphi compiler can also do it in C++, such event also exists in them... Sure it isn't C ANSI, but C ansi does not specifiy those event as far as I know, the GUI gframework can and do.
No, you don't. Read http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf
About the author (W. Kahan) from wikipedia: "Kahan was the primary architect behind the IEEE 754-1985 standard for floating-point computation (and its radix-independent follow-on, IEEE 854). He has been called “The Father of Floating Point,” since he was instrumental in creating the original IEEE 754 specification. Kahan continued his contributions to the IEEE 754 revision that led to the current IEEE 754 standard."
What are the chances that this will be integrated in the Linux kernel ? For better performances as a host and as a guest. I can already see large cluster of Linux running in heterogeneous environments.
If you are writing assembly in javascript you are doing it wrong. A web broswer is supposed to display documents, not run desktop applications. If you really need to process dynamic data with that level of control and efficiency with the result put on a dynamic web page, then you need a daemon or some service application doing it, and have JS pull the result. NOT make JS do the entire damn thing.
The only times I see the argument "Who needs native code?" is when:
A. Someone is trying to make sales / sound good to their boss by using $BUZZWORD / being lazy / $ULTERIOR_MOTIVE.
B. They clearly don't care about resource usage. (Which is what TFA is about.)
C. The user base does not want to install a program, or has some objection as they want it to "Just work" regardless of where they are.
D. There is some crippled device somewhere that is prohibited from running some application due to a walled garden.
In the case of A and B, it's clear abuse. Case A is self-serving, where as B does not care and therefore, cannot be helped.
In C's case, there is some justification, as the user base would most likely move to a different product / service or just get pissed off if it suddenly required downloading an application. Regardless as to what some programmer's believe, if they piss off their user base, they loose users. If they loose too many users, they are running a dead project, or are out of a job. So in this case abusing JS can be somewhat justified.
D is special, as it's a fallacy. The idea of writing some JS to bypass a more serious problem, (I.e. The fact you are trying to run something the device does not permit for some stupid reason.), does not actually fix the real issue. Eventually the gatekeepers will figure out they left a hole in the wall, and they WILL do something about it. The chances of that only go up, as the practice becomes more common place.
The real solution is to get a better platform. Either by convincing the gatekeeper that the application you want to write has merit and should be permitted, or by getting the gatekeeper to open up their platform more. Barring that your only option is: Get a different device, and explain to your users the reason for the lack of support on the old device. Not pretty, and it conflicts with my justifcation of case C, but it's better than ignoring the real issue.
If someone has a case I did not think of, please feel free to add to it. Also if someone has another justification for using JS and asm together I'd love to hear it.
Except for the fact that JavaScript is neither a scripting language nor Java based at all, but rather a complete programming language with a stupid name.
You'd do well to watch these 3 videos if you want to know more about JavaScript.
One of these days I will be next to somebody who will not be an AC and who will confuse Javascript with Java and that person will be very sure of himself that what comes out of his mouth makes any kind of sense. It will be a fine day to murder that person right on the spot. I will truly and thoroughly enjoy it.
will you wait until the rise of your lord and savior to the position of eternal emperor of the world first, so that you can murder this other person on religious grounds and be excused for it?
10/10 flamebait.
I'm guessing he thinks of "software" as a prepackaged binary you buy or download and install on your machine.
What kind of programmer doesn't care about the difference between int, int32, float, float32 or float64 ?
The lack of these types makes JavaScript not really a proper programming language in my book.
Well, I guess it may be splitting hairs... but IMO a "website" is not necessarily "software" any more than a house is "wood" or "plumbing". I can have a "website" that is made up entirely of static HTML and images - or as its simplest, just a single image. And no, I don't think HTML qualifies as software, as it really doesn't fit the common definition of "instructions that direct the operation of hardware"; HTML is structured data, not code.
Anyway, my point in replying to the OP is that even the silliest static website (let alone some Javacript-based client) would not work without the dozens of *native* (or Java-based servers, whatever) software components that are required to realize it in your web browser on your screen.
It's not Java-based, obviously, but it's origins *were* definitely as a scripting language. It was basically designed to automate the creation of HTML documents/fragments on the client by embedding interpreted code. Now, of course, it does a lot more than would be described strictly as a "scripting language", but colloquially most people now equate dynamic interpreted languages with scripting, anyway...
The way I look at it is the Web is a platform. Your front-end code and markup are just as important to your application as if you were coding to X11, to Cocoa, to Win32 or to NCURSES. The logic is still the important part, and it can be implemented on the front end, the back end, or a combination of the two. That makes it inherently more complex than a monolithic application, so programmers who dismiss web scripting as "not real programming" should actually TRY it before looking down their nose at it.
You think it's easy to deploy an accessible, localized, dynamic web application that runs on the desktop and mobile devices flawlessly? It's not, it's quite difficult!
A "scripting" language is just a programming language targeting applications instead of the OS or bare metal.
JavaScript was originally intended only for the browser, yes, but Brendan Eich had big ideas about it. He wanted to use Scheme, but management insisted that the language "look like Java."
https://brendaneich.com/2008/04/popularity/