У меня простой вопрос, может быть, это глупый вопрос, но я просто хочу знать ... Я новичок в lua.

Так, например, у меня есть 2 сценария.

1 .

local text = ''
local level = getUserLevel(self)

if level < 10 then
text = 'Low level'
elseif level >= 10 and level < 20 then
text = 'Average Level'
elseif level >= 20 and level < 30 then
text = 'High Level'
end
sendMsg(self, text)

2 .

  local a = {
    b = {
     [{1, 10}] = {text = "Low Level"},
     [{10, 20}] = {text = "Average Level"},
     [{20, 30}] = {text = "High Level"}
    }
  }
for k, v in pairs (a.b) do
if getUserLevel(self) >= k[1] and getUserLevel(self) < k[2] then
sendMsg(self, v.text)
end

Если оставить в стороне более или менее код, какой из них лучше для улучшения использования процессора?

2
dohdle 21 Апр 2016 в 10:43

2 ответа

Лучший ответ

Первый вызывает getUserLevel один раз. Второй звонит шесть раз. Это, вероятно, будет определяющим фактором здесь, но, как всегда, просто запустите его и измерьте.

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

И, в конечном счете, я не думаю, что эта функция станет горячей точкой для чего-либо. Если это не так, не оптимизируйте его . В первую очередь стремитесь к максимальной читабельности. Просто как тот.

3
Bartek Banachewicz 21 Апр 2016 в 10:54

Первый будет быстрее, значительно быстрее (~ 5 раз), чем второй скрипт с чрезмерно сложной структурой таблиц. Но, как уже было сказано, сценарий с таблицей дает вам более управляемый вариант, легко обновляется и менее подвержен ошибкам.
Но это можно сделать и быстрее. Поскольку у вас есть смежные диапазоны, вам не нужно проверять оба края. Также числовое значение для быстрее, чем пары / ipairs.

local lvls = {
    {1, "Low Level"},
    {10, "Average Level"},
    {20, "High Level"}
}

local function search_name(user_level)
    local text
    for i=1,#lvls do
        local level = lvls[i]
        if level[1]>user_level then
            return text
        end
        text = level[2]
    end
end

print(search_name(getUserLevel(self)))

Этот вариант примерно в 2 раза быстрее, чем ваш исходный табличный подход (с выходом getUserLevel из цикла).

1
Vlad 21 Апр 2016 в 10:37