Перейти к содержимому

Лидеры


Популярный контент

Показан контент с высокой репутацией 30.09.2021 во всех областях

  1. 3 балла
    Посмотрим на байт-код: $ echo 'local function round(nul) return nul + (2 ^ 52 + 2 ^ 51) - (2 ^ 52 + 2 ^ 51) end' | luac5.3 -l -l - main <stdin:0,0> (2 instructions at 0x55f08348ca20) 0+ params, 2 slots, 1 upvalue, 1 local, 0 constants, 1 function 1 [1] CLOSURE 0 0 ; 0x55f08348cc60 2 [1] RETURN 0 1 constants (0) for 0x55f08348ca20: locals (1) for 0x55f08348ca20: 0 round 2 3 upvalues (1) for 0x55f08348ca20: 0 _ENV 1 0 function <stdin:1,1> (4 instructions at 0x55f08348cc60) 1 param, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions 1 [1] ADD 1 0 -1 ; - 6.7553994410557e+15 2 [1] SUB 1 1 -1 ; - 6.7553994410557e+15 3 [1] RETURN 1 2 4 [1] RETURN 0 1 constants (1) for 0x55f08348cc60: 1 6.7553994410557e+15 locals (1) for 0x55f08348cc60: 0 nul 1 5 upvalues (0) for 0x55f08348cc60: Видно, что ADD и SUB тут работают с константой. Обращение к константе быстрое, доступное, лёгкое, воздушное. В предложенном варианте появляется upvalue, к которым доступ будет дольше. Так что эффективнее не станет.
  2. 1 балл
    Чекнул дополнительно пару известных вариантов округления. Топикстартеру респект за наиболее производительное решение: Constant 0.017 Upvalue 0.023 math.floor 0.027 floor (no indexing) 0.025 Lua 5.3+: (num + 0.5) // 1 0.022 Lua 5.2+: num - num % 1 0.026
  3. 1 балл
    Чуть лучше или по крайней мере не хуже должен быть вариант с использованием local floor=math.floor. Вызов же math.floor имеет двойную цену: за обращение к полю таблицы (глобальной переменной) и за, собственно, вызов функции. Что и видно по результатам теста. Локальный же вызов floor() работает шустро. А учитывая, что вариант с использованием floor() выглядит наиболее очевидно, имеет смысл предпочесть именно его.
  4. 1 балл
    @Fingercomp Опыт подтверждает твои выводы: local uptime=require("computer").uptime local function round1(num) return num + (2 ^ 52 + 2 ^ 51) - (2 ^ 52 + 2 ^ 51) end local huge = 2 ^ 52 + 2 ^ 51 local function round2(num) return num + huge - huge end n = 1000000 start=uptime() for i=1,n do round1(1.234) end print("Constant ",uptime()-start) start=uptime() for i=1,n do round2(1.234) end print("Upvalue ",uptime()-start) start=uptime() for i=1,n do math.floor(1.234+0.5) end print("math.floor ",uptime()-start) Предложенный топикстартером вариант эффективнее и моего и floor()
  5. 1 балл
    Если кому лень ждать наколенников, лучше попробовать вот эту вещь: https://github.com/dunstad/roboserver Выглядит роскошнее и шикарнее, но мы её так и не протестили.
  6. 0 баллов
    Попробовал поискать в веб-архиве. Не вышло. Хотя особо не старался, попробовал два сервиса. Было бы здорово организовать на форуме какой-то заповедник для сохранения перезаливов годных наработок
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...