Чушь. Кол-во выделяемой памяти выравнивается по размеру ячейки, поэтому под 1 байт выделится 1 ячейка - 4 байта. И так далее: 2-4, 3-4, 4-4, 5-8, 6-8, 7-8, 8-8, 9-12, ...
Погоня за мифической оптимизацией - не оправдание увеличению вероятности возникновения ошибок.
В первую очередь, система должна быть максимально надёжной.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Согласен. Спасибо за информацию!
Насчет мифической оптимизации - это как раз про Pawn с его виртуальной машиной, т.к. что работает эффективно в одном языке в Pawn наоборот, даже элементарное деление работает быстрее чем побитовый сдвиг. Сам язык не развивается, и говорить про оптимизации на нем не совсем корректно.
Насчет вероятности возникновения ошибок - код приведенный выше, должен работать без ошибок, а вероятность есть в любом алгоритме, она может зависеть не только от не/корректности алгоритма, но, и от внешних факторов.
Если я сказал что она есть - то это не значит что баг обязательно появиться, в нормально построенном моде/программе, алгоритм будет работать идеально!
Смелое утверждение. А теперь докажите свою теорию.
- В односекундном таймере после присвоения массиву true может быть добавлен и другой пользовательский код.
- Между вызовом односекундного таймера и OnPlayerUpdate может быть вызван другой коллбэк, причём не один.
Можете защищать свой индусский код сколько угодно, но факт есть факт - в алгоритме есть ошибки и он будет работать неправильно.
Очередная голословная отговорка.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
div time = 39PHP код:
#include <a_samp>
main() {
new workTime = GetTickCount();
new val = 0;
for(new i = 0; i < 1000000; i++) {
val = i*2;
val /=2;
}
printf("div time = %d",GetTickCount() - workTime);
val = 0;
workTime = GetTickCount();
for(new i = 0; i < 1000000; i++) {
val = i<<1;
val >>= 1;
}
printf("Shift time = %d",GetTickCount() - workTime);
}
Shift time = 58
Сравнение операторов умножения и деления с операторами побитового сдвига.
Я не занимаюсь модостроительством не моя сфера деятельности, то что могут быть ошибки говорил с самого начала.
Этот код лишь шаблон, не нужно делать столь критические выводы.
Последний раз редактировалось NewGreen; 18.10.2014 в 14:18.
Вы ещё на 100 или даже на 10 итераций потестируйте - тогда и format(string, sizeof(string), "%s", str) будет быстрее, чем string = str.
Ну не делает никто тесты на время меньше 1 секунды, да ещё и отдельно друг от друга - любое постороннее приложение может повысить нагрузку на ЦП, повлияв на результат теста.
Увеличим кол-во итераций и переделаем тест так, чтобы сгладить возможную разницу в нагрузке на ЦП, возникающую со временем.
PHP код:
#include <a_samp>
//==================================[Settings]==================================
#define PROFILE_ITERS_MAJOR 1_000_000
#define PROFILE_ITERS_MINOR 100
//====================================[Test]====================================
main()
{
print("Testing...\n");
new ticks0=0, ticks1=0, i, j, t, tmp_ticks;
for(i=0; i<PROFILE_ITERS_MAJOR; ++i)
{
tmp_ticks=GetTickCount();
for(j=0; j<PROFILE_ITERS_MINOR; ++j)
{
t = i*2;
t /= 2;
}
ticks0 += GetTickCount()-tmp_ticks;
tmp_ticks=GetTickCount();
for(j=0; j<PROFILE_ITERS_MINOR; ++j)
{
t = i<<1;
t >>= 1;
}
ticks1 += GetTickCount()-tmp_ticks;
}
printf("Multiplication/division: %d", ticks0);
printf("Shifting to the left/right: %d", ticks1);
print("\n");
}
Разница небольшая, но всё же есть, и далеко не в пользу операций умножения/деления.
Впрочем, не удивлюсь, если на хостинге разница в пользу операций сдвига будет куда более значительной - в версии сервера для Linux используется более эффективная реализация виртуальной машины с расширениями GNU C.
Тогда зачем предлагать такой код, если знаете, что в нём ошибки?
Думаете, кому-то нужен будет заведомо ненадёжный метод из-за каких-то 10-20 сэкономленных процессорных тактов? -_-
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Позвольте узнать параметры вашего компьютера, у меня Intel Core i7 4770K – 3.50GHz. / Intel Z87/LAN ASUS Z87-PRO
и вот такие результаты кода приведенного вами:
Скажу так, изначально я предлагал следующий вариант, вместо присваивания переменной, значение функции GetTickCount(), использовать булевые переменные с true/false, также я лишь показал пример алгоритма, при этом предупреждая о возможных недостатках, если бы я хотел кому то что то предложить, я бы создал отдельную тему.
- - - Добавлено - - -
А на Linux уже результат другой:
Последний раз редактировалось NewGreen; 18.10.2014 в 18:27.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Я могу признать что был не прав, в том что предложил заведомо недоработанный вариант алгоритма, тем не менее, акцент делался не на сам алгоритм (это был лишь набросок), а на то что в конткретном случае с системой АФК, эффективнее использовать булевые переменные как переключатель, нежели присваивать переменной значение функции.
Развели мы с вами холивар тут.
Эффективнее, но не приемлемее для данной ситуации. Могли бы просто подождать более удачного случая, нежели плодить быдлокодеров из тех, кто последует вашему примеру. Даже если пытаться объяснить недостатки, всё равно найдутся те, кто не поймёт (или просто не захочет понимать в погоне за "оптимизацией") ни одного вашего слова и будет смотреть только на код.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Эту тему просматривают: 4 (пользователей: 0 , гостей: 4)