"HikksNotAtHome" <hi************@aol.com> wrote in message
news:20***************************@mb-m06.aol.com...
<snip>
alerts 330 and 500 for me, which indicates eval is faster. But
thats on a 2.2 Ghz Machine with 256mbs Ram. Will test it again
tomorrow at work, on a slower machine, just to see how much
difference it makes. But it can only make a bigger difference.
<snip>
It looks to me like the results vary considerably depending on the
browser. For IE eval is quickest, on Opera 7 and Mozilla 1.3 split
followed by division comes out on top (500 Mhz PIII Win 98).
Taking:-
myNumber = tempObj[c].split('/')
N = myNumber[0]/myNumber[1];
- as the basis for comparison (100% on each browser)
IE = 100%
Op = 100%
Mz = 100%
myNumber = tempObj[c].split('/')
N = (+myNumber[0])/(+myNumber[1]);
IE = 98.74%
Op = 98.36%
Mz = 100%
myNumber = tempObj[c].split('/')
N = parseFloat(myNumber[0])/parseFloat(myNumber[1]);
IE = 108.26%
Op = 118.03%
Mz = 109.52%
N = eval(tempObj[i]);
IE = 17.50%
Op = 154.10%
Mz = 122.22%
N = new Function('return ('+tempObj[i]+');')();
IE = 163.58%
Op = 286.88%
Mz = 152.38%
For comparison, this is my test page:-
<html>
<head>
<title></title>
<script type="text/javascript">
var frm = null;
var fncts = ['emptyL','evalVersion','FunctionObject',
'splitNparseFloat','splitNunaryPlus','splitNdivide '];
var running = false;
function setButtons(bl){
frm['loopLimit'].disabled = bl;
var sw = frm['bt'];
if(typeof sw.length == 'undefined'){
sw = [sw];
}
for(var c = 0;c < sw.length;c++){
sw[c].disabled = bl;
}
}
var tempObj = new Object();
function doTests(){
if(!running){
var t = ['','/',''];
frm = document.forms['f'].elements;
setButtons(true);
t[2] = +frm['loopLimit'].value;
for (var k=0;k<t[2];k++){
t[0] = k;
tempObj[k]= t.join('');
}
frm["Dur0"].value = '';frm["Avr0"].value = '';
for(var c = 1;c < fncts.length;c++){
frm["Dur"+c].value = '';
frm["Avr"+c].value = '';
frm["CAvr"+c].value = '';
frm["PAvr"+c].value = '';
frm["Res"+c].value = '';
}
running = true;
act(0);
}
}
function act(p){
/* setTimeout is used to minimise the occurrences
of 'a script on this page is running slow' dialogs. */
if(p >= fncts.length){
setTimeout('report()',100);
}else{
setTimeout((fncts[p]+'('+p+');'),200);
}
}
function report(){
var lim = +frm['loopLimit'].value;
var emDur = +frm["Dur0"].value
var unaC = (frm["Dur"+(fncts.length-1)].value - emDur) / lim;
frm["CAvr"+(fncts.length-1)].value = unaC;
frm["PAvr"+(fncts.length-1)].value = '100';
for(var c = 1;c < (fncts.length-1);c++){
if(frm["Cb"+c].checked){
var evaC = (frm["Dur"+c].value - emDur) / lim;
frm["CAvr"+c].value = evaC;
frm["PAvr"+c].value = ((evaC/unaC)*100);
}else{
frm["CAvr"+c].value = 'X';
frm["PAvr"+c].value = 'X';
}
}
setButtons(false);
running = false;
}
function emptyL(p){
var lim = +frm['loopLimit'].value;
var totTime,stTime = new Date().getTime();
for(var c = 0;c < lim;c++){
;
}
totTime = (new Date().getTime() - stTime)
frm["Dur0"].value = totTime;
frm["Avr0"].value = (totTime/lim);
act(p+1);
}
function evalVersion(p){
if(frm['Cb'+p].checked){
var lim = +frm['loopLimit'].value;
var N;
var totTime,stTime = new Date().getTime();
for(var c = 0;c < lim;c++){
N = eval(tempObj[c]);
}
totTime = (new Date().getTime() - stTime)
frm["Dur"+p].value = totTime;
frm["Avr"+p].value = (totTime/lim);
frm["Res"+p].value = N;
}else{
frm["Dur"+p].value = 'X';
frm["Avr"+p].value = 'X';
frm["Res"+p].value = 'X';
}
act(p+1);
}
function FunctionObject(p){
if(frm['Cb'+p].checked){
var lim = +frm['loopLimit'].value;
var N;
var totTime,stTime = new Date().getTime();
for(var c = 0;c < lim;c++){
N = new Function('return ('+tempObj[c]+');')();
}
totTime = (new Date().getTime() - stTime)
frm["Dur"+p].value = totTime;
frm["Avr"+p].value = (totTime/lim);
frm["Res"+p].value = N;
}else{
frm["Dur"+p].value = 'X';
frm["Avr"+p].value = 'X';
frm["Res"+p].value = 'X';
}
act(p+1);
}
function splitNparseFloat(p){
if(frm['Cb'+p].checked){
var lim = +frm['loopLimit'].value;
var N,temp;
var totTime,stTime = new Date().getTime();
for(var c = 0;c < lim;c++){
temp = tempObj[c].split('/')
N = parseFloat(temp[0])/parseFloat(temp[1]);
}
totTime = (new Date().getTime() - stTime)
frm["Dur"+p].value = totTime;
frm["Avr"+p].value = (totTime/lim);
frm["Res"+p].value = N;
}else{
frm["Dur"+p].value = 'X';
frm["Avr"+p].value = 'X';
frm["Res"+p].value = 'X';
}
act(p+1);
}
function splitNunaryPlus(p){
if(frm['Cb'+p].checked){
var lim = +frm['loopLimit'].value;
var N,temp;
var totTime,stTime = new Date().getTime();
for(var c = 0;c < lim;c++){
temp = tempObj[c].split('/')
N = (+temp[0])/(+temp[1]);
}
totTime = (new Date().getTime() - stTime)
frm["Dur"+p].value = totTime;
frm["Avr"+p].value = (totTime/lim);
frm["Res"+p].value = N;
}else{
frm["Dur"+p].value = 'X';
frm["Avr"+p].value = 'X';
frm["Res"+p].value = 'X';
}
act(p+1);
}
function splitNdivide(p){
if(frm['Cb'+p].checked){
var lim = +frm['loopLimit'].value;
var N,temp;
var totTime,stTime = new Date().getTime();
for(var c = 0;c < lim;c++){
temp = tempObj[c].split('/')
N = temp[0]/temp[1];
}
totTime = (new Date().getTime() - stTime)
frm["Dur"+p].value = totTime;
frm["Avr"+p].value = (totTime/lim);
frm["Res"+p].value = N;
}else{
frm["Dur"+p].value = 'X';
frm["Avr"+p].value = 'X';
frm["Res"+p].value = 'X';
}
act(p+1);
}
</script>
</head>
<body>
<p>
<form name="f" action="#">
Loop Length = <input type="text" value="50000"
name="loopLimit"> Some browsers will put up an "A script on
this page is making the browser run slowly" dialog. If this
happens the results for the test will be invalid and a shorter loop
will be needed. However, JavaScript Date objects do not tend to be
accurate to less than 10 milliseconds so duration results that are
not different by at least 20 milliseconds (and preferably 100+) are
not necessarily meaningful and a longer loop may be needed to acquire
useful results.<br><br>
<input type="button" value="Test" name="bt" onclick="doTests();">
Repeat tests to reduce/expose the influence of background tasks.
<br><br>
Empty Loop Duration (milliseconds) = <input type="text" value="X"
name="Dur0"><br>
Empty Loop Average (milliseconds) = <input type="text" value="X"
name="Avr0" size="22"><br><br>
Test <code>N = eval(tempObj[i]);</code> ? <input type="checkbox"
name="Cb1" checked><br>
<code>N = eval(tempObj[i]);</code> Duration (milliseconds) =
<input type="text" value="X" name="Dur1"><br>
<code>N = eval(tempObj[i]);</code> Average (milliseconds) =
<input type="text" value="X" name="Avr1" size="22"><br>
(result = <input type="text" value="X" name="Res1" size="22">)<br><br>
Test <code>N = new Function('return ('+tempObj[i]+');')();</code> ?
<input type="checkbox" name="Cb2"><br>
<code>N = new Function('return ('+tempObj[i]+');')();</code>
Duration (milliseconds) = <input type="text" value="X"
name="Dur2"><br>
<code>N = new Function('return ('+tempObj[i]+');')();</code>
Average (milliseconds) = <input type="text" value="X"
name="Avr2" size="22"><br>
(result = <input type="text" value="X" name="Res2" size="22">)<br><br>
Test <code>N = parseFloat(myNumber[0])/parseFloat(myNumber[1]);</code>
? <input type="checkbox" name="Cb3" checked><br>
<code>N = parseFloat(myNumber[0])/parseFloat(myNumber[1]);</code>
Duration (milliseconds) = <input type="text" value="X"
name="Dur3"><br>
<code>N = parseFloat(myNumber[0])/parseFloat(myNumber[1]);</code>
Average (milliseconds) = <input type="text" value="X"
name="Avr3" size="22"><br>
(result = <input type="text" value="X" name="Res3" size="22">)<br><br>
Test <code>N = (+myNumber[0])/(+myNumber[1]);</code> ? <input
type="checkbox" name="Cb4" checked><br>
<code>N = (+myNumber[0])/(+myNumber[1]);</code>
Duration (milliseconds) = <input type="text" value="X"
name="Dur4"><br>
<code>N = (+myNumber[0])/(+myNumber[1]);</code>
Average (milliseconds) = <input type="text" value="X"
name="Avr4" size="22"><br>
(result = <input type="text" value="X" name="Res4" size="22">)<br><br>
Test <code>N = myNumber[0]/myNumber[1];</code> ?
<input type="checkbox" name="Cb5" checked><br>
<code>N = myNumber[0]/myNumber[1];</code>
Duration (milliseconds) = <input type="text" value="X"
name="Dur5"><br>
<code>N = myNumber[0]/myNumber[1];</code>
Average (milliseconds) = <input type="text" value="X"
name="Avr5" size="22"><br>
(result = <input type="text" value="X" name="Res5" size="22">)<br><br>
<input type="button" value="Test" name="bt" onclick="doTests();">
Repeat tests to reduce/expose the influence of background tasks.
<br><br>
Results: (duration of test - duration of empty loop) / loop length<br>
<code>N = eval(tempObj[i]);</code> Average (milliseconds) =
<input type="text" value="X" name="CAvr1" size="22"><br>
<code>N = new Function('return ('+tempObj[i]+');')();</code>
Average (milliseconds) = <input type="text" value="X"
name="CAvr2" size="22"><br>
<code>N = parseFloat(myNumber[0])/parseFloat(myNumber[1]);</code>
Average (milliseconds) = <input type="text" value="X"
name="CAvr3" size="22"><br>
<code>N = (+myNumber[0])/(+myNumber[1]);</code> Average (milliseconds)
= <input type="text" value="X" name="CAvr4" size="22"><br>
<code>N = myNumber[0]/myNumber[1];</code> Average (milliseconds) =
<input type="text" value="X" name="CAvr5" size="22"><br><br>
Differences (<code>((Math.round(Math.random()))||-1)</code> = 100%)
<br><code>N = eval(tempObj[i]);</code> = <input type="text" value="X"
name="PAvr1" size="22">%<br>
<code>N = new Function('return ('+tempObj[i]+');')();</code> =
<input type="text" value="X" name="PAvr2" size="22">%<br>
<code>N = parseFloat(myNumber[0])/parseFloat(myNumber[1]);</code> =
<input type="text" value="X" name="PAvr3" size="22">%<br>
<code>N = (+myNumber[0])/(+myNumber[1]);</code> = <input type="text"
value="X" name="PAvr4" size="22">%<br>
<code>N = myNumber[0]/myNumber[1];</code> = <input type="text"
value="X" name="PAvr5" size="22">%<br>
</form>
</p>
</body>
</html>
Richard.