Как стать автором
Обновить

Тест на скорость год спустя

Время на прочтение 3 мин
Количество просмотров 2.1K
imageЭта публикация является продолжением прошлогоднего моего поста и последующей заметки. Целый год тестовые скрипты валялись где-то на диске. Дело не дошло до сравнения JavaScript vs C#, которое напрашивалось после позорного провала JScript.NET. Не дошло, потому что я не чувствовал в себе силы адекватно перевести тесты с JavaScript, хоть и активно программирую на С#. Кроме того, я сделал пробный заход, и мне показалось, что чуда не будет. Сейчас я все-таки решил привести тестовый пакет в порядок, так, чтобы каждый мог его опробовать. Возможно, у кого-то хватит сил добавить адекватное сравнение с C#.
Под катом будут результаты тестов год спустя, ссылка на Github, и новый(старый) способ использования движка JScript от IE9 вне самого IE9.



Движок из IE9.



За год IE9 успел официально выйти. Ранее я полагал, что после релиза новый движок JScript будет подменять в системе старый. Так было со всеми движками до этого. Однако, после установки официального IE9 обнаружил, что в директории С:\Windows\System32 присутствует две библиотеки — jscript.dll и jscript9.dll.
Windows Script Host после установки IE9 продолжает использовать старый движок версии 5.8. Старый трюк с подменой имени библиотеки в реестре не проходит. Одновременно библиотека jscript9.dll зарегистрирована с другим GUID в реестре. Я уже начал терять надежду на использование нового движка вне IE, но решение все же нашлось — необходимо просто зарегистрировать GUID jscript9.dll в качестве еще одного Scripting Engine для Windows Active Scripting. У меня это получилось при помощи следующего *.reg файла.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\JavaScript9]

[HKEY_CLASSES_ROOT\JavaScript9\CLSID]
@="{16d51579-a30b-4c8b-a276-0ff4dc41e755}"


Теперь скрипты можно запускать на 9-й версии JScript из командной строки

cscript.exe //E:JavaScript9 script.js

Тестовый пакет



Пакет выложен на Github. Для запуска тестов, кроме самого пакета, понадобятся:

  • NodeJS — можно скачать и установить, или скачать только EXE файл;
  • JSDB — можно скачать с официального сайта архив, и распаковать куда-нибудь;
  • Компилятор JScript.NET — установить соответствующую версию .NET Framework;
  • Движок интерпретатора JScript — можно использовать тот, что уже есть в системе. Если же установлен IE9, то необходимо провести манипуляции, описанные в предыдущем разделе. Если хочется тестировать более старые версии… да кому это надо!?


Для запуска тестов используется набор простых CMD файлов. Сеанс тестирования запускается файлом

dotest.cmd

Для того чтобы включить в тестирование какой-либо движок, просто раскомментируйте соответствующую строчку в этом файле.
Каждый тест интерпретаторов запускается соответствующим файлом вида run.*.cmd, запуск тестов JScript.NET производится файлами comp.NET.*.cmd. Перед запуском тестов необходимо убедиться:
  1. что пути в нужных файлах run.*.cmd правильно указывают на исполняемые файлы движков (если они не прописаны в переменной окружения PATH)
  2. что пути в нужных файлах comp.NET.*.cmd указывают на установленные версии .NET Framework


Каждый прогон тестов создает новый HTML файл в подпапке results, который и представляет собой почти готовый для презентации результат теста.

Сами тесты размещаются в папке tests; туда можно добавлять свои тесты, не обязательно чтобы сравнить производительность разных движков. Например, можно еще рассмотреть разные решения одной задачи в пределах одного движка. Вот пример тестового файла:
!function(){
	
	var str1 = 'Hello ',
	    str2 = 'world ',
	    str3 = 'test ',
	    i = 0; 
 	
	
	tests.push({
		name: 'String Concat',
		func: function(){
		 i++;
		 return str1+str2+str3+' '+i;
		},
	    reduce: function(r,x){ return r+x.length;},
	    start: 0,
	    loops: 100000
	});
	
}();



Как видно, в массив tests нужно добавить объект с такими свойствами:
  • name — имя теста;
  • func — тестируемый код, который может возвращать некий результат, для проверки того, что код правильно работает на разных движках;
  • reduce — функция для накопления результатов итераций теста;
  • start — стартовое значение для reduce;
  • loops — количество итераций теста.


Результат последнего теста

















Опубликовать результаты оказалось проще в виде картинок. Если кому-то нужны табличные данные вот исходный файл.

Что интересно — в родных тестах новый V8 значительно быстрее старого, а в моих чуть медленнее.
Следует также отметить, что тесты эти ни в коем случае не отражают преимущества NodeJS в асинхронном вводе/выводе. Все тесты синхронные и мы тестируем просто разные версии движка V8. Для тестирования именно асинхронных преимуществ NodeJS нужно писать специальные тесты. Правда, в таком случае не понятно с чем еще его сравнивать в рамках этого пакета. Другие движки не предоставляют похожих возможностей event loop.
Ну и в конце, как обычно, ничего не значащий рейтинг:



Да «железо» в этом году другое и JScript 5.8 показал явно лучшие результаты. Впрочем, и сборка 5.8 немного другая.
Теги:
Хабы:
+23
Комментарии 25
Комментарии Комментарии 25

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн