Предлагаю к рассмотрению простой тест, результаты которого, тем не менее, разнятся в разных браузерах.
Тесты представляют собой разные реализации следующего алгоритма:
Если n=1, то цикл прерывается.
Если n — чётное, то n умножается на 3 и к результату прибавляется 1, если нечётное, то n делится на 2.
Реализаций 4 и вот они:
1. «classics from 90-s»
Проверка на наличие элемента в массиве исполняется функцией isNaN(). Данный тест проверяет скорость и корректность обрабатывания этой функции.
2. «modern»
Проверка на наличие элемента в массиве исполняется вставкой в условия этого элемента.
3. «fast»
Проверка на наличие элемента в массиве исполняется командой in, которая проверяет, есть ли такой индекс в массиве.
4. «Chromium killer»
Проверка на наличие элемента в массиве исполняется вставкой в условия этого элемента.
От варианта 2 «modern» отличается заменой
n=(n%2)?3*n+1:n/2
на
k=n/2
n=(k<Math.round(k))?3*n+1:k
Всё время указано в миллисекундах(millisecs).
Зелёным цветом выделен самый быстрый, а красным — самый медленный результат теста браузера.
ХУДШИЙ оказался Internet Explorer 8.0, для которого тест с инструкцией in был самым медленным. Время за другие тесты — дольше всех!
ЛУЧШИЕ Mozilla Firefox 6.0.2 и его сородич по движку SeaMonkey 2.3.3 разделили почётные первые два места.
Так горячо любимой мне Opera 11.50 досталось место 4, совсем ненамного которого обогнал Safari 5.1.
SRWare Iron, сородич Google Chrome, занимает пятое место.
Присылайте свои результаты в комментариях!
P.S. скорее всего, перелезу жить в Firefox дабы шустро жить!
Что это за тесты?
Тесты представляют собой разные реализации следующего алгоритма:
- input n
- print n
- if n = 1 then STOP
- if n is odd then n:=3n+1
- else n:=n/2
- GOTO 2
Если n=1, то цикл прерывается.
Если n — чётное, то n умножается на 3 и к результату прибавляется 1, если нечётное, то n делится на 2.
Реализаций 4 и вот они:
1. «classics from 90-s»
for (var current=first;current<=last;current++)
{
var n=current,i,k,m,currpath=[]
for (i=0;(n!=1)&&(isNaN(cycle[n]));i++)
{
currpath[i]=n
n=(n%2)?3*n+1:n/2
}
if (-i<=0)
{
if(n==1) i++
else
{
if(!isNaN(cycle[n]))
{
i=i+cycle[n]
}
}
if(i>maxcycle) maxcycle=i
for(k=0;k<currpath.length;k++)
{
if(!isNaN(currpath[k]))
cycle[currpath[k]]=i-k
}
}
}
Проверка на наличие элемента в массиве исполняется функцией isNaN(). Данный тест проверяет скорость и корректность обрабатывания этой функции.
2. «modern»
for (var current=first;current<=last;current++)
{
var n=current,i,k,m,currpath=[]
for (i=0;(n!=1)&&(!(cycle[n]));i++)
{
currpath[i]=n
n=(n%2)?3*n+1:n/2
}
if (-i<=0)
{
if(n==1) i++
else
{
if(cycle[n])
{
i=i+cycle[n]
}
}
if(i>maxcycle) maxcycle=i
for(k=0;k<currpath.length;k++)
{
if(currpath[k])
cycle[currpath[k]]=i-k
}
}
}
Проверка на наличие элемента в массиве исполняется вставкой в условия этого элемента.
3. «fast»
for (var current=first;current<=last;current++)
{
var n=current,i,k,m,currpath=[]
for (i=0;(n!=1)&&(!(n in cycle));i++)
{
currpath[i]=n
n=(n%2)?3*n+1:n/2
}
if (-i<=0)
{
if(n==1) i++
else
{
if(n in cycle)
{
i=i+cycle[n]
}
}
if(i>maxcycle) maxcycle=i
for(k=0;k<currpath.length;k++)
{
if(k in currpath)
cycle[currpath[k]]=i-k
}
}
}
Проверка на наличие элемента в массиве исполняется командой in, которая проверяет, есть ли такой индекс в массиве.
4. «Chromium killer»
for (var current=first;current<=last;current++)
{
var n=current,i,k,m,currpath=[]
for (i=0;(n!=1)&&(!(cycle[n]));i++)
{
currpath[i]=n
k=n/2
n=(k<Math.round(k))?3*n+1:k
}
if (-i<=0)
{
if(n==1) i++
else
{
if(cycle[n])
{
i=i+cycle[n]
}
}
if(i>maxcycle) maxcycle=i
for(k=0;k<currpath.length;k++)
{
if(currpath[k])
cycle[currpath[k]]=i-k
}
}
}
Проверка на наличие элемента в массиве исполняется вставкой в условия этого элемента.
От варианта 2 «modern» отличается заменой
n=(n%2)?3*n+1:n/2
на
k=n/2
n=(k<Math.round(k))?3*n+1:k
Результаты
браузер | 1) classics from 90-s | 2) modern | 3) fast | 4) Chromium killer | среднее время | место |
Internet Explorer 8.0 | 3735 | 3547 | 20515 | 3657 | 7863,5 | 6 |
Mozilla Firefox 6.0.2 | 258 | 229 | 232 | 246 | 241,25 | 1 |
SeaMonkey 2.3.3 построен на движке Gecko/20110902 как и Firefox 6.0.2 |
262 | 232 | 232 | 249 | 243,75 | 2 |
Opera 11.50 | 653 | 609 | 652 | 684 | 649,5 | 4 |
Safari 5.1 | 623 | 571 | 578 | 612 | 596 | 3 |
SRWare Iron 13.0.800.1 браузер, построеный на движке Chromium |
1295 | 1182 | 1164 | 1260 | 1225,25 | 5 |
Зелёным цветом выделен самый быстрый, а красным — самый медленный результат теста браузера.
ХУДШИЙ оказался Internet Explorer 8.0, для которого тест с инструкцией in был самым медленным. Время за другие тесты — дольше всех!
ЛУЧШИЕ Mozilla Firefox 6.0.2 и его сородич по движку SeaMonkey 2.3.3 разделили почётные первые два места.
Так горячо любимой мне Opera 11.50 досталось место 4, совсем ненамного которого обогнал Safari 5.1.
SRWare Iron, сородич Google Chrome, занимает пятое место.
Присылайте свои результаты в комментариях!
И я хочу попробовать!
http://sample.cgi2m.net.ua/hs3nplus1/index1.htmlP.S. скорее всего, перелезу жить в Firefox дабы шустро жить!