Pull to refresh

Проверка скорости работы JavaScript браузера с помощью небольшого теста

Предлагаю к рассмотрению простой тест, результаты которого, тем не менее, разнятся в разных браузерах.


Что это за тесты?


Тесты представляют собой разные реализации следующего алгоритма:
  1. input n
  2. print n
  3. if n = 1 then STOP
  4. if n is odd then n:=3n+1
  5. else n:=n/2
  6. GOTO 2
В цикле вычисляется значение n.

Если 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
Всё время указано в миллисекундах(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, занимает пятое место.
Присылайте свои результаты в комментариях!
 

И я хочу попробовать!

http://sample.cgi2m.net.ua/hs3nplus1/index1.html

P.S. скорее всего, перелезу жить в Firefox дабы шустро жить!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.