Переключение на Главную Страницу Страницы: [1] 2 3 ... 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Сравнительная производительность 1С и JavaScript (число прочтений - 22226 )
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Сравнительная производительность 1С и JavaScript
24. Января 2014 :: 12:51
Печать  
Довелось мне заняться написанием обработки для расчета оптимального маршрута развоза товаров между несколькими точками (задача коммивояжера). В качестве основы для вывода карты и роутинга выбрано API Яндекс-карт, а платформа 1С 8.2 в режиме УФ (от других платформ я практически ушел и они мне неинтересны). Но вопрос не об этом, хотя и он интересен. Дело в том что решение этой задачи требует дикого количества вычислений. И вот тут я наткнулся на тот факт что JS делает это намного быстрее 1С. Специально для подтверждения гипотезы мной были написаны несколько тестов, результаты которых я привожу ниже, а сами тесты в аттачах. Ради спортивного интереса сделал тест и для 1С 7.7. Можно было продолжить линейку тестов и сделать их для 1С 8.2 в режиме обычного приложения, протестировать в веб-клиенте, сделать на 1С 7.7 с объектом WebBrowser - но это уже не имело особого смысла да и ИМХО неинтересно.

Тесты проводил на своем ультрабуке с i5 под Win 8.1 x64 где тест TPC-1C-GILV-A от Гилева дает 52 попугая. Хотя на всякий случай перепроверил еще на двух клиентских ПК с i7 под Win 7 x64 - тенденция аналогичная. Тесты проводились на чистых конфигурациях. Версии 1С 7.70.27 и 8.2.19.80.

Код теста (для JS аналогично, для 1С 7.7 вместо массива использованы переменные)


Для Итерация = 1 По 10 Цикл
     Массив = Новый Массив(4);
     Для Виток = 1 По КоличествоВитков Цикл
           Массив[0] = Виток%1000;
           Массив[1] = Виток/1000;
           Массив[2] = Виток*1000;
           Массив[3] = Массив[0]+Массив[1]+Массив[2];
     КонецЦикла;
КонецЦикла;



Тест 1С 8.2 УФ: среднее время 46'908 мс



Тест 1С 7.7: среднее время 77'832 мс



Тест JS в поле HTML-документа: среднее время 386 мс на первом выполнении, и около 101 мс на всех последующих



Тест JS в объекте MSScriptControl: среднее время 8'565 мс



По результатам этих тестов у меня возникло много вопросов, которые остались без ответа:

  • Почему 1С делает расчеты несравненно медленнее JS? Ведь оба языка - интерпретаторы. Разница составляет 464 раза для 1С 8.2 и 771 раз для 1С 7.7! Мне кажется это вообще недопустимо - так писать интерпретаторы как 1С.
  • Почему JS в поле HTML выполняется быстрее чем в MSScriptControl? Разница составляет 85 раз. Разные движки? Получается MS в принципе уже наплевать на MSScriptControl, и оптимизацией движка занимается только для IE? Хотя в поле HTML (он же ActiveX WebBrowser) версию IE сто лет уже не меняли, и она так и остается IE7 когда уже IE11 есть.
  • Почему при первом запуске JS в поле HTML он отрабатывает намного медленнее чем при последующих запусках? Кэширование? А что можно кэшировать в вычислениях?
  • Как сделать в 1С 8.2 УФ скрытое поле HTML-документа чисто для выполнения расчетов? Пробовал менять видимость поля - не катит, 1С после этого с ним не работает.

Тест для 1С 8.2 УФ: http://101321.selcdn.ru/pub.maljaev.ru/%D0%A2%D0%B5%D1%81%D1%82%D0%9F%D1%80%D0%B...
Тест для 1С 7.7: http://101321.selcdn.ru/pub.maljaev.ru/%D0%A2%D0%B5%D1%81%D1%82%D0%9F%D1%80%D0%B...
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #1 - 24. Января 2014 :: 13:27
Печать  
Сдаётся мне (навскидку) что дело в арифметических операциях, а точнее в том, как числа представляются в 1С. Там же не float, а свой формат, что-то типа Numeric в SQL. Отсюда и тормоза.
  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #2 - 24. Января 2014 :: 13:43
Печать  
Пробовал использовать только целочисленные операции с числами - результат аналогичный.
Пробовал даже использовать просто цикл без вычислений - результат аналогичный.  Улыбка

Создал копипастом статью на Инфостарте (появится после модерации), возможно удастся привлечь внимание к этой фиче: http://infostart.ru/public/253802/
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #3 - 24. Января 2014 :: 13:53
Печать  
Не, с числами любые операции в 1С будут тормозить. А вот например, если вместо арифметики строки мучать:

     А = "1";
     Б = "2";
     В = "3";
     Г = А + Б + В;

то у меня вышло

Начало теста 1С на 100 000 витков
1C: 3018
Жаба: 2044


В тесте с числами убрал Сообщить(), мерил только общее время

Начало теста 1С на 100 000 витков
1C: 11838
Начало теста 1С на 100 000 витков
Жаба: 1664

т.е. разница "всего лишь" на порядок, а не на 3
  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #4 - 24. Января 2014 :: 13:55
Печать  
Я конечно попробую со строками, но ИМХО весь учет в 1С построен в основном на числах. Улыбка
Но за наводку для дальнейших экспериментов спасибо.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #5 - 24. Января 2014 :: 14:08
Печать  
Ну, я бы сказал, что учёт в 1С построен на работе с БД, так что потери на арифметику пренебрежительно малы.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #6 - 24. Января 2014 :: 14:10
Печать  
Это у тебя задача просто нетипичная, как обычно Улыбка
  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #7 - 24. Января 2014 :: 14:24
Печать  
В общем неправда ваша. Улыбка Сделал тесты сам на 10'000'000 витков:

Код
Выбрать все
Для Виток = 1 По КоличествоВитков Цикл
	А = "1";
	Б = "2";
	В = "3";
	Г = "" + А + Б + В;
КонецЦикла; 





Код
Выбрать все
var a, b, c, d;
for (var vitok = 0; vitok < kolVitkov; vitok++) {
	a = "1";
	b = "2";
	c = "3";
	d = ""+a+b+c;
}; 





Разница в 2243 раза.  Смех
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #8 - 24. Января 2014 :: 14:33
Печать  
Хм... может, я туплю? У меня такой тест

Код
Выбрать все
Процедура Сформировать()
	Сообщить("Начало теста 1С на " + СокрЛП(Формат(КоличествоВитков, "Ч15.0. ")) + " витков");
	Старт = _GetPerformanceCounter();

	СуммаВремени = 0;

	Для Итерация = 1 По 10 Цикл
		БылоВремя = _GetPerformanceCounter();

		Для Виток = 1 По КоличествоВитков Цикл
			//А = Виток % 1000;
			//Б = Виток / 1000;
			//В = Виток * 1000;
			//Г = А + Б + В;
			А = "1";
			Б = "2";
			В = "3";
			Г = А + Б + В;
		КонецЦикла;

		//ВремяВитка = _GetPerformanceCounter() - БылоВремя;
		//СуммаВремени = СуммаВремени + ВремяВитка;

		//Сообщить("Итерация " + СокрЛП(Итерация) + ": " + СокрЛП(ВремяВитка) + " мс");
	КонецЦикла;

	Стоп = _GetPerformanceCounter();
	Время = Стоп - Старт;
	Сообщить("1C: "+Время);
	//Сообщить("Среднее: " + СокрЛП(Окр(СуммаВремени / 10)) + " мс");
КонецПроцедуры

Процедура Жаба()
	Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
	Скрипт.Language = "JScript";
	Стр = "
	|function SpeedTest(nCycles)
	|{
	|	for( i = 1; i <= 10; i++ )
	|	{
	|		for( j = 1; j <= nCycles; j++ )
	|		{
	|			/*
	|			a = j % 1000;
	|			b = j / 1000;
	|			c = j * 1000;
	|			d = a + b + c;
	|			//*/
	|
	|			//*
	|			a = '1';
	|			b = '2';
	|			c = '3';
	|			d = a + b + c;
	|			//*/
	|		}
	|	}
	|}
	|";
	Скрипт.AddCode(стр);


	Сообщить("Начало теста 1С на " + СокрЛП(Формат(КоличествоВитков, "Ч15.0. ")) + " витков");

	Старт = _GetPerformanceCounter();
	Скрипт.Run("SpeedTest", КоличествоВитков);
	Стоп = _GetPerformanceCounter();
	Время = Стоп - Старт;
	Сообщить("Жаба 1: "+Время);

	Старт = _GetPerformanceCounter();
	Скрипт.Run("SpeedTest", КоличествоВитков);
	Стоп = _GetPerformanceCounter();
	Время = Стоп - Старт;
	Сообщить("Жаба 2: "+Время);
КонецПроцедуры
 



комменты оставил, а то вдруг я там чего-то напутал Улыбка
  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #9 - 24. Января 2014 :: 14:35
Печать  
Конечно! Я же еще в первом посте написал что MSScriptControl отдыхает. Ты JS в поле HTML-документа попробуй или если в 1С 7.7 - то в в WebBrowser ActiveX.

P.S. Ты вообще первый пост внимательно прочитал/просмотрел?  Подмигивание
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #10 - 24. Января 2014 :: 15:04
Печать  
Проверил с HTML-документом, результаты

Начало теста 1С на 10 000 витков
Жаба HTML: 4400
Жаба ScriptControl: 4306

Но у меня вынь ХП, 32.

  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #11 - 24. Января 2014 :: 15:06
Печать  
Что ж, сочувствую.... Улыбка
А я на трёх компах перепроверил, но все не ниже Win7.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #12 - 24. Января 2014 :: 15:09
Печать  
это было со строками, а с числами

Начало теста 1С на 10 000 витков
Жаба HTML: 158
Жаба ScriptControl: 164

может, ещё и влияние 64-разрядной архитектуры сказывается?
  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #13 - 24. Января 2014 :: 15:11
Печать  
Сейчас на Ксеоне попробую под Win Server.
P.S. Не могу, там платформа старая, а ставить новую сейчас не хочется - могут быть проблемы.
P.P.S. Хотя нет, есть у меня еще один чистый Ксеон - туда можно 1С поставить.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Сравнительная производительность 1С и JavaScript
Ответ #14 - 24. Января 2014 :: 15:41
Печать  
на ксеоне, вынь 2008, 64

Начало теста 1С на 1 000 000 витков
Жаба HTML: 441
Жаба ScriptControl: 9335
1C: 22242 (ошибка, тест был со строками) -> 103311 (правильное время)

причём, JS я запускал как из 1С (7.7), так и просто как файл - результат один.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 5
ОтправитьПечать