Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Оптимизация с помощью eval (https://javascript.ru/forum/misc/48384-optimizaciya-s-pomoshhyu-eval.html)

foo 01.07.2014 23:03

Оптимизация с помощью eval
 
В этом коде
fu=function(arg1, arg2){
    if(condition1) return arg1
    if(condition2) return arg2
}

fu(long_calculation1(), long_calculation2())

несмотря на то, что какой то один, а может и оба аргумента могут не понадобиться, они все равно вычисляются. Если переписать вот так
fu=function(arg1, arg2){
    if(condition1) return eval (arg1)
    if(condition2) return eval (arg2)
}

fu("long_calculation1()", "long_calculation2()")

Все будет намного быстрей. Можно оборачивать не в строки а в функции, а внутри вызывать, только запись будет более громоздкой.

Я, почему-то не видел никогда примеров подобных оптимизаций в js, хотя, решения, казалось бы, очевидны. Это моветон что ли? Или есть какие-то подводные камни?

Aetae 01.07.2014 23:21

Потому что:
fu=function(arg1, arg2){
    if(condition1) return arg1()
    if(condition2) return arg2()
}
 
fu(long_calculation1, long_calculation2)


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

foo 01.07.2014 23:29

Aetae,
Я написал там в конце, что можно обернуть функциями, Вы повторяетесь.
Цитата:

Сообщение от Aetae
eval сам по себе ни для каких оптимизаций не годится, потому что он ломает низкоуровневые механизмы внутренней оптимизации самого движка, что очень сильно сказывается на скорости.

Не знаю, что там сказывается, я проверил у себя в ноде, разницы между вызовом функции и эвалом практически нет. Эвал даже быстрей оказался. Это Вы, похоже, бьете в бубны и произносите заклинания.

Aetae 01.07.2014 23:38

Тфу, на автора поста не посмотрел.

foo 01.07.2014 23:39

Aetae,
Слив засчитан

MallSerg 02.07.2014 00:29

Пиши тесты удивляй всех результатами своих оптимизаций )

foo 02.07.2014 00:39

Цитата:

Сообщение от MallSerg
Пиши тесты удивляй всех результатами своих оптимизаций )

А зачем? Так разве не видно? Это же простая логика

MallSerg 02.07.2014 01:03

Какая то жуткая и извращенная логика отсутствием минимального опыта и здравого смысла.

Ты даже не понимаешь что сравниваешь теплое с мягким
в первом случае fu(long_calculation1(), long_calculation2()) т.е. ты вызываешь функции до вызова функции fu
во втором случае ты передаешь строки в которых находятся имена функции. и не вызываешь функции до того как передать их в функцию fu
это разное поведение

Aetae нарисовал тебе как добиться такого же поведения без идиотизма с eval

Такого извращения над switch я давно не видел

Да и такое бессмысленное жонглирование функциями нужно лечить электрическим током

foo 02.07.2014 01:29

Цитата:

Сообщение от MallSerg
Aetae нарисовал тебе как добиться такого же поведения без идиотизма с eval

разуй глаза, он повторил как попугай, то что я написал в стартовом посте
Цитата:

Сообщение от MallSerg
это разное поведение

Да??? А мужики то и не знали!
Цитата:

Сообщение от MallSerg
switch

Похоже, ты вообще не понимаешь, о чем речь идет

foo 02.07.2014 01:45

Цитата:

Сообщение от MallSerg
до вызова функции fu

Ну да, на этом месте, конечно, надо под столом валяться. Ты не только крутой жабаскриптер, ты и программист, вообще, очень сильный, в целом.

Dandy 02.07.2014 13:52

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

foo 02.07.2014 17:25

Цитата:

Сообщение от Dandy
вызываются все функции, в не зависимости нужны они или нет.

Это Вы со мной разговариваете? Если да, то короткий ответ: нет.

Dandy 02.07.2014 18:25

Цитата:

Сообщение от foo
короткий ответ: нет

Ок. мб я недопонимаю чего-то. Объясните пж. в двух словах что происходит в ваших примерах? :)

Aetae 02.07.2014 18:29

Dandy, трололо в стиле раннего максимаксимуса(а возможно это он и есть, просто вернулся к корням ткскзть). Просто игнорируйте его.

foo 02.07.2014 18:47

Цитата:

Сообщение от Dandy
мб я недопонимаю

Судя по вашему комметарию, Вы не понимаете if. Как следствие -- вы не понимаете, ни первого ни второго ни третьего варианта. Кратко -- if ленив.
Вам следует в эту сторону посмотреть.

melky 02.07.2014 18:55

Цитата:

Сообщение от foo
Можно оборачивать не в строки а в функции, а внутри вызывать, только запись будет более громоздкой.

а в чём проблема? функции и передавай

foo 02.07.2014 18:56

Цитата:

Сообщение от melky
а в чём проблема?

Ни в чем. Просто более громоздко, я там написал. Но можно, в данном случае.

Dandy 02.07.2014 18:58

Гениальный ответ! Ясно.
Aetae, спасибо. :)

foo 02.07.2014 19:00

Dandy,
Ваш сарказм выглядит жалко. Даже этот Ваш Aetae вполне понимает, что Вы в неведении. Но после этой борзоты желание объяснять что-то пропало.

melky 02.07.2014 19:02

Цитата:

Сообщение от foo (Сообщение 319207)
Ни в чем. Просто более громоздко, я там написал. Но можно, в данном случае.

ну, хреновую запись можно не бояться, на крайняк есть кофескрипты с их легковесной записью "->" или arrow function в ES6

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

foo 02.07.2014 19:04

melky,
Я не спорю, что можно, в данном случае оба варианта эквивалентны. Кому что нравиться.

krasovsky 09.07.2014 08:22

fu=function(arg1, arg2){.......В этой строке ты УЖЕ вычислил обе функции, объясни зачем вычисленному выражению нужна оптимизация?


Часовой пояс GMT +3, время: 23:59.