I don't know why I wrote such stupid code for readMatrix.js. I guess when someone uses a new language their brain cells seize up, effective function becomes impossible.
After tests I ran on Friday, I wanted to see how Javascript does with floating point numbers? JS only supports 64 bit floating-point numbers, but there must be special code in their to make integers look like integers ... unless their isn't.
When I went to update my code to support numbers with fractions, my first thought was to flag whether a decimal point had been seen and then keep track of the value by which to divide, multiplying by ten for each fractional digit. I quickly realized I was sinking into the mire of coding stupidity; JS must have a function to convert strings into integers or floats, and indeed it has parseInt() and parseFloat(). But in my research I discovered ( or re-discovered ) that there's no need for the conversion. Like Perl, JS allows arithmetic on the string representation of numbers:
This made me think about how I would parse the file in Perl, using split(). I knew JS had map(), so quite likely it would have split() as well. And it does! So all that manual processing went in the trash, and I simplified readMatrix.js to
{Correction - Although the original JS used only floats, including for integer values, Googles V* JS engine, the one used in node.js, has separate 32 bit integers.}
Although integers are represented by 64-bit IEEE floating point numbers, integer multpiplication is still 3 times as fast as floating point multiplication. There are clearly optimizations that are being made use of to improve performance.
After tests I ran on Friday, I wanted to see how Javascript does with floating point numbers? JS only supports 64 bit floating-point numbers, but there must be special code in their to make integers look like integers ... unless their isn't.
When I went to update my code to support numbers with fractions, my first thought was to flag whether a decimal point had been seen and then keep track of the value by which to divide, multiplying by ten for each fractional digit. I quickly realized I was sinking into the mire of coding stupidity; JS must have a function to convert strings into integers or floats, and indeed it has parseInt() and parseFloat(). But in my research I discovered ( or re-discovered ) that there's no need for the conversion. Like Perl, JS allows arithmetic on the string representation of numbers:
1 + 2 ⇛ 3
"1" + "2"⇛ 3
This made me think about how I would parse the file in Perl, using split(). I knew JS had map(), so quite likely it would have split() as well. And it does! So all that manual processing went in the trash, and I simplified readMatrix.js to
exports.readMatrix = function (err, data) {
if (err) {
throw err;
}
var rows = data.split(/ *\n/)
.filter(function(val) {
return val.length > 0;
});
var matrix = [], i, len;
for ( 1 = 0, len = rows.length; i<len; i++ ) {
matrix[i] = rows[i].split(/ +/);
}
return matrix;
};
I think I had the two chunks merged, in an online TryIt editor I was experimenting with,but this is compact enough for the moment.{Correction - Although the original JS used only floats, including for integer values, Googles V* JS engine, the one used in node.js, has separate 32 bit integers.}
Calculating average operations per second shows small matrixes have performance limited by other overhead, but larger matrices are pumping along at 7.8 million multiplications per second.
Comments