myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
 
Ответить в данную темуНачать новую тему

> От: Способы Повышения Производительности, От темы с ID: 1018

Теги
Нет тегов для показа
Setuper
сообщение 30.1.2009, 14:03
Сообщение #1


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Преимущества метода перед функцией.

Рассмотрим простейший пример. Допустим мы хотим добавить в таблицу новое поле iIP, которое будет отвечать за численное представление ip адреса пользователя и в дальнейшем использовать это поле в своей программе. Для преобразования ip адреса в число используем функцию Ip2Num.

Реализация задумки через функцию:
Код
cUser = function(tData)
  function Update(tData)
    tData.iIP = Ip2Num(tData.sIP)
    return tData
  end
end


Использование этой функции:
Код
function UserConnected(tUser)
  tUser = cUser(tUser)
  tUser = Update(tUser)
  ...
end


Теперь рассмотрим реализацию этой идеи через метод:
Код
cUser = function(tData)
  function tData:Update()
    self.iIP = Ip2Num(self.sIP)
  end
end


Использование метода:
Код
function UserConnected(tUser)
  tUser = cUser(tUser)
  tUser:Update()
  ...
end



В чём же преимущества метода? Разберём написанные коды. Что делается, когда мы используем функцию?

Когда мы пишем tUser = Update(tUser), то это работает следующим образом: сначала создаётся локальная переменная, в которую копируются все данные, содержащиеся в таблице tUser и эта локальная переменная передаётся в функцию Update в качестве параметра tUser, после этого в функции Update с этой локальной переменной производятся некоторые манипуляции, после чего эта переменная возвращается функцией Update и присваивается опять же таблице tUser.

Рассмотрим что же происходит в случае использования метода? Когда мы используем метод tUser:Update(), то никакого создания локальной переменной не происходит! Метод Update() работает непосредственно с переменной tUser, поэтому ему не нужно возвращать какие-либо значения - всё происходит налету.

Отсюда, в случае использования метода, происходит явная экономия и памяти и процессорного времени!

Программисты С/С++ могут сразу же воскликнуть: метод LUA - это передача параметра по ссылке в C/C++.

По возможности всегда используйте метод, а не функцию !!!
Использование метода намного оптимизирует работу скрипта !!!
Go to the top of the page
+Quote Post
Iskandark
сообщение 2.2.2009, 0:56
Сообщение #2


Активный участник
***

Группа: Пользователи
Сообщений: 61
Регистрация: 24.10.2008
Из: Moscow
Пользователь №: 875
Спасибо сказали: 0 раз




Есть как раз вопрос по использованию этого метода. Сам никак не могу допереть. А именно вопросы по скрипту викторины, который я прилагаю. Там как раз все функции реализованны таким методом) Но смущает кое что другое, попробую объяснить (сразу извиняюсь за корявость, надеюсь будет понятно):

В самом начале там задается таблица TrivEx = {}, а потом начинается вызов функций: TrivEx:SendToPlayers(...), TrivEx:ParseData(mode,curUser,data) и т.д.
Затем встречается такой вызов: self:WriteTable(...), self:SendToPlayers(...), self:SendToPlayers(...) и т.д.
Затем такой curTriv:ShowAnswer(), curTriv:SetGetQues(...) ...

Теперь вопросы. Почему внчале задается такая таблица TrivEx = {}, а таблицы self={} и curTriv={} не задаются?
С какой целью задается так много типов ссылок curTriv:, self: и TrivEx:?
Ведь эти ссылки не несут никакой информации в себе, т.е. нагрузку на память?
И последнее, использование этого метода в таком большом скрипте должно сильно ускорить его работу? или же эффект может быть не заметен, если использовать обычный вызов функции?
Go to the top of the page
+Quote Post
Setuper
сообщение 2.2.2009, 3:13
Сообщение #3


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Я сейчас напишу три эквивалентных кода. Думаю тогда станет понятно)))

Код
tTable = {}
tTable.iNumber = 123

function tTable:Func(iParam)
  return iParam + tTable.iNumber
end


Код
tTable = {}
tTable.iNumber = 123

function tTable:Func(iParam)
  return iParam + self.iNumber
end


Код
tTable = {}
tTable.iNumber = 123

function tTable.Func(tTable, iParam)
  return iParam + tTable.iNumber
end


Ну что так понятнее? Эти 3 кода эквивалентны (делают одно и тоже), и в данном случае по скорости выполнения эквивалентны только 2 первых кода. В третьем коде происходит создание локальной переменной tTable и копирование в неё значения. Использование метода является эффективнее из-за того, что не происходит создания новой переменной и копирования в неё значения, а происходит работа с адресом переменной метода, которую можно сравнить как параметр, передающийся по ссылке в С++.
То есть self это скрытый параметр метода: tTable:Func(iParam) <=> tTable.Func(self=tTable, iParam)
Go to the top of the page
+Quote Post

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No new Способы Повышения Производительности
методы оптимизации lua кода
33 Setuper 49 140 20.10.2014, 10:24 Посл. сообщение: Setuper

 



RSS Сейчас: 26.11.2024, 23:32