От: Способы Повышения Производительности, От темы с ID: 1018 |
Здравствуйте, гость ( Вход | Регистрация )
От: Способы Повышения Производительности, От темы с ID: 1018 |
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++. По возможности всегда используйте метод, а не функцию !!! Использование метода намного оптимизирует работу скрипта !!! |
|
|
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:? Ведь эти ссылки не несут никакой информации в себе, т.е. нагрузку на память? И последнее, использование этого метода в таком большом скрипте должно сильно ускорить его работу? или же эффект может быть не заметен, если использовать обычный вызов функции? |
|
|
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) |
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последнее сообщение | |
---|---|---|---|---|---|
Способы Повышения Производительности методы оптимизации lua кода |
33 | Setuper | 49 140 | 20.10.2014, 10:24 Посл. сообщение: Setuper |
|
Сейчас: 26.11.2024, 23:32 |