Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 06.07.2014, 14:23
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

Сообщение от kobezzza
Это разные функции?
пардон, я там ошибся, правильно
Код:
a=eval("(function(){'test'})")
Тут суть в том, что она тут тоже компилиться на каждой итерации, поэтому получается, что эвал быстрей
Ответить с цитированием
  #12 (permalink)  
Старый 06.07.2014, 14:35
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Тут суть в том, что она тут тоже компилиться на каждой итерации, поэтому получается, что эвал быстрей
Ещё раз: на Function используется JIT, а на eval нет.

Для тестов:

var a = [], 
     b = [];

var f1 = eval('(function (val) { a.push(val); })');
var f2 = new Function('val', 'b.push(val)');

for (var i = 0; i < 1e6; i++) {
    f1(i);
}

for (var i = 0; i < 1e6; i++) {
    f2(i);
}


Результат будет одинаков, т.к. в обоих случаях элементарное содержимое функций, а если у тебя в теле функций будет сложная логика, вызовы других функций и т.д., то велика вероятность, что встроенный JIT даст значительный профит на варианте с Function, в то время как eval никак не будет обрабатываться.

Т.е. твои тесты - убоги и не несут никакой полезной информации.
__________________
kobezzza
code monkey
Ответить с цитированием
  #13 (permalink)  
Старый 06.07.2014, 14:37
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

Сообщение от kobezzza
Это разные по функционалу функции?
ваш пример как раз доказывает, что
Код:
a=eval("(function(){'test'})")
b=Function("'test'")
console.log(""+a)
console.log(""+b)

out:
function (){'test'}
function anonymous() {
'test'
}
эквивалентны.
Ответить с цитированием
  #14 (permalink)  
Старый 06.07.2014, 14:47
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
эквивалентны
Да, только

// У тебя было
Function("test") // поиск идентификатора test

// А не
Function("'test'") // создание литерала строки 'test'
__________________
kobezzza
code monkey
Ответить с цитированием
  #15 (permalink)  
Старый 06.07.2014, 14:58
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

Сообщение от kobezzza
Результат будет одинаков
Кто бы сомневался, в цикле то выполняются уже скомпилированные ф-ции. Это все равно что написать
Код:
f1=function(){"test1"}
f2=function(){"test2"}

while(...)f1()
while(...)f2()
Это уж 100% тесты ни о чем. У тебя разница (мизерная) только на этапе создания(однократного). Просто феерический идиотизм.
Ответить с цитированием
  #16 (permalink)  
Старый 06.07.2014, 15:03
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

foo, слишком толсто, удаляюсь из темы.
__________________
kobezzza
code monkey
Ответить с цитированием
  #17 (permalink)  
Старый 06.07.2014, 15:06
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

Сообщение от kobezzza
поиск идентификатора test
А какая разница в данном случае? Там функция только создается, разница была бы только в том случае, если бы она вызывалась.
Ответить с цитированием
  #18 (permalink)  
Старый 06.07.2014, 15:07
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

Сообщение от kobezzza
слишком толсто
Толстым был как раз предложенный Вами тест. Я до сих пор не понял, то ли это шутка была, то-ли серьезно.
Ответить с цитированием
  #19 (permalink)  
Старый 06.07.2014, 15:10
foo foo вне форума
Профессор
Отправить личное сообщение для foo Посмотреть профиль Найти все сообщения от foo
 
Регистрация: 17.05.2014
Сообщений: 197

kobezzza,
Код:
	var f1 = eval('(function (val) { a.push(val); })');
	var f2 = new Function('val', 'b.push(val)');

	console.log(f1)
	console.log(f2)
[Function]
[Function]
Если чо.
Ответить с цитированием
  #20 (permalink)  
Старый 06.07.2014, 18:04
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от foo Посмотреть сообщение
Толстым был как раз предложенный Вами тест. Я до сих пор не понял, то ли это шутка была, то-ли серьезно.
Уффф... я говорю про скорость работы полученной функции, а не про скорость компиляции строки.

Никто и никогда не будет делать так:

for (...) {
    Function('console.log(...)')()
}


Поэтому я и говорю, что твои тесты бессмысленны. Что они тестируют? Скорость компиляции - это не узкое место.

Я же говорю про скорость работы полученной функции и привёл пример, где эта скорость одинакова, но пояснил, что она одинакова только в этом частном случае, т.к. у функций слишком простое тело.

Я сказал, что во всех современных VM JS используются JIT компиляторы и что конструкции eval не обрабатываются этим самым компилятором, а вот Function обрабатываются. Гугли что такое JIT компилятор и как он работает, может станет понятно.

Т.е. чем сложнее тело функции, тем очевиднее разница в скорости функции полученной через Function и eval.

global.a = [];
global.b = [];

function test() {
	var f1 = eval('(function (val) { global.a.push(val); })');
	var f2 = new Function('val', 'global.b.push(val)');
	
	console.time('start');
	for (var i = 0; i < 1e6; i++) {
		f1(i);
	}
	console.timeEnd('start');
	
	console.time('start2');
	for (var i = 0; i < 1e6; i++) {
		f2(i);
	}
	console.timeEnd('start2');
}

test();


Вот уже чуть более сложный пример у меня Function при тесте в V8 быстрее в 3 раза.

Теперь ты понял?
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 06.07.2014 в 18:06.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции Hol1killer Prototype & script.aculo.us 11 05.12.2016 01:37
В ИЕ 10 не работает скрипт alexmixaylov Internet Explorer 2 15.09.2013 15:41
не работает ajax в IE xber9 jQuery 5 27.08.2013 21:04
Jin: И снова о наследовании tenshi Ваши сайты и скрипты 16 19.08.2013 20:30
Подскажите,как решить 2 вопроса dima*** Общие вопросы Javascript 28 06.05.2013 22:35