PDA

Просмотр полной версии : Длина имен


Kopilkus
28.08.2007, 01:34
вот такой вопрос: отрожается ли как-нибудь длинна имен полей и методов на скорости выполнения программы. ведь, как я понял, даже после транслирования в байт код именна остаются неизменными для сохраниения возможности манипуляции клипом извне. есть ли разница, например я назову метод btnSetScrollPositionOnRelease() или f1()?

Kikasso
28.08.2007, 01:46
На такой вопрос легко получить ответ:
function btnSetScrollPositionOnRelease( i ){
return i+1;
}
function f1( i ){
return i+1;
}

var t = getTimer();
var n = 100000;
while( n-- )f1( i );
trace(getTimer() - t);


t = getTimer();
n = 100000;
while( n-- )btnSetScrollPositionOnRelease ( i );
trace(getTimer() - t);
у меня выводит 793 и 803

Kopilkus
28.08.2007, 02:44
спасибо, как видно: разница не такая уж и большая. осмысленные имена рулят)

iNils
28.08.2007, 02:57
Разницы вообще нет. Такой метод не точный, при следующем запуске может быть и 805/780, и 800/800 и тд.

Kikasso
28.08.2007, 03:16
Ну не знаю, я поставил проверку на интервал - короткая стабильно обгоняет. Для чистоты эксперимента поменял функции местами - длинная снова отстает.
Где-то я вроде читал про имена переменных длиннее 8 символов. Ощущение есть такое.

У меня получилось в среднем 4% разницы, пока чай пил.

iNils
28.08.2007, 04:07
У меня длинная всегда "чуть" быстрее. Так, что "твоя" закономерность не подтвердилась :)
Я ж говорю, что метод не точный. С его помощью можно судить о порядке скорости, но ни как ни о 100% точности. И разница при таком числе итераций роли не играет.

etc
28.08.2007, 09:50
Разницы вообще нет никакой. Хоть километровые пишите.
Вызов метода происходит по ссылке, а не по имени. Даже если и по имени, скорость поиска метода от длины строки никак не зависит.
Загляните в спеку по байткоду, е-мае, а не делайте совершенно сомнительные тесты. Вся несостоятельность теста проявляется, если использовать имена одинаковой длины.

Кстати, вот, что мне выдал трейс при двух запусках (для функций с разными длинами имен):

823
804
795
817

В одном случае, второе быстрее, во втором — первое.

Kikasso
28.08.2007, 10:51
Я нашел откуда "ощущение осталось" - это из другой оперы. http://php.spb.ru/php/speed.html#2

Kopilkus
28.08.2007, 12:08
может я конечно много всего не понимаю, но байткод же конечный этап трансляции, вот, например, там есть строка:


push 'a'


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

etc
28.08.2007, 12:38
Неправда. Длина строки никоим образом не влияет на скорость поиска.

Этот «ящик» называется стек. А в данном случае произошла ретрансляция пи-кода (чтобы читать было проще и не смотреть каждый раз в словарь). В реальности в push в байт-коде написан индекс элемента из словаря констант. Т.е., примерно так:

push c:0

Например, код:

a = 10;
b = a;

Пи-код, выдаваемый flasm-ом (чаще всего):

constants 'a', 'b'
push 'a', 10
setVariable
push 'b', 'a'
getVariable
setVariable
end
Смотрим байт-код:

88 06 00 02 00 61 00 62 00 96 07 00 08 00 07 0A
00 00 00 1D 96 04 00 08 01 08 00 1C 1D 00
Или так:
88 06 02 00 61 00 62 00 = constants 'a', 'b'
96 07 00 08 00 07 0A 00 00 00 = push c:0, 10
1D = setVariable
96 04 00 08 01 08 00 = push c:1, c:0
1C = getVariable
1D = setVariable
00 = end
Как видно, в push используются Dictionary Lookup, т.е. переданный индекс ссылается на элемент в словаре.
Я не знаю точного механизма работы getVariable и что происходит в памяти, но уверен, что длина имени никак не повлияет на скорость нахождения необходимой переременной в памяти, в текущем пространстве. Потому как происходит перебор всех объектов в данной области видимости и запрос имени. Если имя совпадает с переданным (а имя, скорее всего, является тем же Dictionary Lookup, т.е. простым индексом), то в стек помещается ссылка на объект в памяти. И поиск, как я уже говорил, скорее всего идет по индексу, а не по имени, как таковому. А при таком подходе длина имени никак не повлияет на скорость. Даже если и по имени, то скорость будет зависеть от количества объектов в памяти (в конкретной области видимости), а не длины имени.

Kikasso
28.08.2007, 13:06
Не зависит, говорите? А давайте еще удлиним.
function btnSetScrollPositionOnReleasebtnSetScrollPositionOnReleasebtnSetScrollPositionOnReleasebtnSetScrollPositionOnRelease( i ){
return i+1;
}
function f1( i ){
return i+1;
}

var t = getTimer();
var n = 100000;
while( n-- )f1( i );
trace(getTimer() - t);


t = getTimer();
n = 100000;
while( n-- )btnSetScrollPositionOnReleasebtnSetScrollPositionOnReleasebtnSetScrollPositionOnReleasebtnSetScrollPositionOnRelease ( i );
trace(getTimer() - t);
У меня 10% разницы.
Другое дело, что эти затраты несущественны - в функции есть еще какой-то код, который выполняется дольше, чем ищется она сама.
Или с другой стороны зайдем:
var a=1;
var b=1;
var c=1;
var qwertyuiopasdfghjklmnbvcxzzxcvbbvjhrgiurhmheriugjijvgudfgbndmfjbd=1;
var ljmqwertyuiopasdfghjklmnbvcxzzxcvbbvjhrgiurhmheriugjijvgudfgbndmfjbd=1;
var ljmqwertyuiopasdfutiopuomcsifdkemopfghjklmnbvcxzzxcvbbvjhrgiurhmheriugjijvgudfgbndmfjbd=1;

function f1(){
a+=b;
a+=c;
}
function f2(){
qwertyuiopasdfghjklmnbvcxzzxcvbbvjhrgiurhmheriugjijvgudfgbndmfjbd+=ljmqwertyuiopasdfghjklmnbvcxzzxcvbbvjhrgiurhmheriugjijvgudfgbndmfjbd;
qwertyuiopasdfghjklmnbvcxzzxcvbbvjhrgiurhmheriugjijvgudfgbndmfjbd+=ljmqwertyuiopasdfutiopuomcsifdkemopfghjklmnbvcxzzxcvbbvjhrgiurhmheriugjijvgudfgbndm fjbd;
}
var t = getTimer();
var n = 100000;
while( n-- )f1();
trace(getTimer() - t);

t = getTimer();
n = 100000;
while( n-- )f2();
trace(getTimer() - t);

etc
28.08.2007, 13:23
function a( i ){
return i+1;
}
function zasjhgdakjsdjkhxjzkcbkaksgdhjkahdfkjasbdajkdhgajksdgkajsgdhagskjvbzxgcjkahdjhasjdhaskdgdnxbxcxbvjkashgdfjlkahdlashdlasdajkghsdfjksdgfa( i ){
return i+1;
}

var t = getTimer();
var n = 500000;
while( n-- )a ( i );
trace(getTimer() - t); // 4201


t = getTimer();
n = 500000;
while( n-- )zasjhgdakjsdjkhxjzkcbkaksgdhjkahdfkjasbdajkdhgajksdgkajsgdhagskjvbzxgcjkahdjhasjdhaskdgdnxbxcxbvjkashgdfjlkahdlashdlasdajkghsdfjksdgfa ( i );
trace(getTimer() - t); // 4201

Kikasso
28.08.2007, 13:27
4000
4454
Это наверное на маке не зависит, а под виндами ощущается.

etc
28.08.2007, 13:29
К вопросу о применимости подобных тестов:

t = getTimer();
n = 500000;
while (n--) {
}
trace(getTimer()-t);

onMouseDown = function () {
t = getTimer();
n = 500000;
while (n--) {
}
trace(getTimer()-t);
};