Я люблю Lua. I love Lua.

Вопросы производительности — 2

Posted in Uncategorized by ilovelua on Сентябрь 17, 2012

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

Код модуля:

module('TestModule', package.seeall)

local localTable = {}
testTable = {}

local count = 1000000

-- добавляем в модуль полей, чтобы поиск осуществлялся не в совсем пустой таблице
for i = 1, 100 do
    _M['testTable' .. i] = i
end

function fillTestTable()
    for i = 1, count do 
        testTable[i] = i
    end
end

function fillLocalTable()
    for i= 1, count do 
        localTable[i] = i
    end
end

Код теста:

local TestModule = require('TestModule')

function test()
    local t = os.clock ()
    TestModule.fillTestTable()
    local t1 = os.clock () - t

    t = os.clock ()
    TestModule.fillLocalTable()
    local t2 = os.clock () - t

    return t1, t2
end

local percents = {}

for i = 1, 100 do
    local t1, t2 = test()
    local delta = string.format('%.6f', t1 - t2)
    local p = string.format('%.6f', ((t1 - t2) / t1) * 100)

    print(i, 'delta:', delta, '%', p)

    table.insert(percents, p)
end

local totalPercents = 0

for i, percent in ipairs(percents) do
    totalPercents = totalPercents + percent
end

print('average percents is:', totalPercents / #percents)

Результаты:

1 delta: 0.020000 % 15.748031
2 delta: 0.023000 % 22.549020
3 delta: 0.022000 % 21.782178
4 delta: 0.022000 % 21.782178
5 delta: 0.022000 % 21.782178
6 delta: 0.022000 % 21.782178
7 delta: 0.022000 % 21.782178
8 delta: 0.021000 % 20.792079
9 delta: 0.021000 % 20.792079
10 delta: 0.021000 % 20.792079
11 delta: 0.021000 % 20.792079
12 delta: 0.023000 % 22.549020
13 delta: 0.021000 % 20.792079
14 delta: 0.023000 % 22.549020
15 delta: 0.022000 % 21.782178
16 delta: 0.023000 % 22.549020
17 delta: 0.023000 % 22.549020
18 delta: 0.023000 % 22.549020
19 delta: 0.021000 % 20.792079
20 delta: 0.023000 % 22.330097
21 delta: 0.021000 % 20.792079
22 delta: 0.022000 % 21.782178
23 delta: 0.022000 % 21.782178
24 delta: 0.021000 % 20.792079
25 delta: 0.023000 % 22.549020
26 delta: 0.021000 % 20.792079
27 delta: 0.022000 % 21.568627
28 delta: 0.022000 % 21.568627
29 delta: 0.024000 % 23.076923
30 delta: 0.022000 % 21.782178
31 delta: 0.021000 % 20.792079
32 delta: 0.022000 % 21.782178
33 delta: 0.023000 % 22.549020
34 delta: 0.022000 % 21.782178
35 delta: 0.022000 % 21.782178
36 delta: 0.022000 % 21.782178
37 delta: 0.022000 % 21.782178
38 delta: 0.022000 % 21.782178
39 delta: 0.021000 % 20.792079
40 delta: 0.022000 % 21.782178
41 delta: 0.021000 % 20.792079
42 delta: 0.022000 % 21.782178
43 delta: 0.022000 % 21.782178
44 delta: 0.022000 % 21.782178
45 delta: 0.020000 % 19.801980
46 delta: 0.022000 % 21.782178
47 delta: 0.023000 % 22.549020
48 delta: 0.022000 % 21.782178
49 delta: 0.022000 % 21.782178
50 delta: 0.022000 % 21.782178
51 delta: 0.023000 % 22.549020
52 delta: 0.022000 % 21.782178
53 delta: 0.022000 % 21.782178
54 delta: 0.022000 % 21.782178
55 delta: 0.021000 % 20.792079
56 delta: 0.022000 % 21.782178
57 delta: 0.022000 % 21.782178
58 delta: 0.022000 % 21.782178
59 delta: 0.022000 % 21.782178
60 delta: 0.021000 % 20.792079
61 delta: 0.020000 % 20.000000
62 delta: 0.022000 % 21.782178
63 delta: 0.022000 % 21.782178
64 delta: 0.021000 % 20.792079
65 delta: 0.022000 % 21.782178
66 delta: 0.021000 % 20.792079
67 delta: 0.022000 % 21.782178
68 delta: 0.022000 % 21.782178
69 delta: 0.021000 % 20.792079
70 delta: 0.022000 % 21.782178
71 delta: 0.022000 % 21.782178
72 delta: 0.022000 % 21.782178
73 delta: 0.022000 % 21.782178
74 delta: 0.022000 % 21.782178
75 delta: 0.022000 % 21.782178
76 delta: 0.021000 % 20.792079
77 delta: 0.022000 % 21.782178
78 delta: 0.022000 % 21.782178
79 delta: 0.022000 % 21.782178
80 delta: 0.023000 % 22.549020
81 delta: 0.022000 % 21.782178
82 delta: 0.022000 % 21.782178
83 delta: 0.023000 % 22.549020
84 delta: 0.022000 % 21.782178
85 delta: 0.023000 % 22.549020
86 delta: 0.022000 % 21.782178
87 delta: 0.022000 % 21.782178
88 delta: 0.022000 % 21.782178
89 delta: 0.022000 % 21.782178
90 delta: 0.022000 % 21.782178
91 delta: 0.023000 % 22.549020
92 delta: 0.022000 % 21.782178
93 delta: 0.022000 % 21.782178
94 delta: 0.022000 % 21.782178
95 delta: 0.022000 % 21.782178
96 delta: 0.022000 % 21.782178
97 delta: 0.021000 % 20.792079
98 delta: 0.022000 % 21.782178
99 delta: 0.022000 % 21.782178
100 delta: 0.022000 % 21.568627
average percents is: 21.61547195

Вывод: обращение к локальным переменным на ~20% быстрее, чем к полям модуля.
Локальные переменные — наши друзья.

Реклама

комментария 2

Subscribe to comments with RSS.

  1. Alexander Gladysh said, on Сентябрь 17, 2012 at 7:00 дп

    Обращаю внимание, что для luajit2 цифры будут совсем другими.

    Кстати, у меня есть framework для таких микробенчмарков. Patches are welcome: https://github.com/agladysh/luamarca

  2. ilovelua said, on Сентябрь 17, 2012 at 7:08 дп

    Ну, исходники все есть, Вы могли бы приложить результаты тестов для luajit2, будет интересно сравнить.


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: