|
|
  |
Помогите освоить LUA |
|
|
sutra |
18.12.2018, 23:01
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Цитата сишной объявите. Так и была сишная. Играл с типами, но что-то толком не понял как быстрее, всё равно медленнее. Не стал забивать себе голову. Вообще убрал этот внутренний цикл. Стало некрасивей, но это оказался самый быстрый вариант. Цитата Попрбуй использовать для сравнения наименьший и наибольший каналы Я понял, понял. Но там и так всё быстро и надёжно. Может не так быстро, как можно сделать, но всё компактно и красиво. А когда в бешеном цикле вертеть картинки, то лишние операторы всё равно вызовут тормоза. На картинках главное сами картинки и упрощённая до безобразия функция сравнения. В общем я просто подстроил под собственные нужды, всё равно получается быстро, просто уже начал с жиру беситься. (IMG: style_emoticons/default/biggrin.gif) Спасибо за советы. Имитировал наихудшую ситуацию, когда типа искало и ничего не смогло найти. 1000 картинок за 6 сотых секунды. Чего выпендриваться - достойная скорость. Искало по всем пикселям 500х23 * 1000 картинок = 6 сотых сек.. Грубо говоря полный перевод на СИ, увеличил скорость в 2 раза. А тот внутренний цикл, хрен его знает. Там и ридмем и сравнение и цикл. На чём-то ускоряется, на чём-то замедляется. Выкинул цикл и всех делов.
|
|
|
|
sutra |
21.12.2018, 1:21
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Код --lua local ffi=require "ffi" log "clear" log "mode compact" local n=ffi.new("uint32_t[3]") local x,y,z=ffi.new("uint32_t"),ffi.new("uint32_t"),ffi.new("uint32_t") x,y,z=0,0,0 tmc=os.clock() repeat x=x+1 repeat y=y+1 if y>x then z=1 else z=2 end until y>100000000 until x>100000000 log(os.clock()-tmc) tmc=os.clock() repeat n[0]=n[0]+1 repeat n[1]=n[1]+1 if n[1]>n[0] then n[2]=1 else n[2]=2 end until n[1]>100000000 until n[0]>100000000 log(os.clock()-tmc) stop_script()
Похоже я жестоко ошибся и нельзя делать массивы, придётся переделывать свои функции. Дарить более 100% скорости - грех.
|
|
|
|
sutra |
21.12.2018, 2:01
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Дарк, чего-то я вообще ничего не понимаю. Может я чего не то делаю? Вот тестани этот код. У меня получается медленнее на СИ-шных, на массиве разница вообще очевидная. Код log "clear" log "mode compact" do local n=ffi.new("uint32_t[3]") local x,y,z=ffi.new("uint32_t"),ffi.new("uint32_t"),ffi.new("uint32_t") x,y,z=0,0,0 tmc=os.clock() repeat x=x+1 repeat y=y+1 if y>x then z=1 else z=2 end until y>100000000 until x>100000000 log(os.clock()-tmc) tmc=os.clock() repeat n[0]=n[0]+1 repeat n[1]=n[1]+1 if n[1]>n[0] then n[2]=1 else n[2]=2 end until n[1]>100000000 until n[0]>100000000 log(os.clock()-tmc) end
do local n={} n[1],n[2],n[3]=0,0,0 local x,y,z=0,0,0 tmc=os.clock() repeat x=x+1 repeat y=y+1 if y>x then z=1 else z=2 end until y>100000000 until x>100000000 log(os.clock()-tmc) tmc=os.clock() repeat n[1]=n[1]+1 repeat n[2]=n[2]+1 if n[2]>n[1] then n[3]=1 else n[3]=2 end until n[2]>100000000 until n[1]>100000000 log(os.clock()-tmc) end stop_script() Понятно только одно, массивы однозначно медленнее! Cirus, а у тебя как? Тоже медленнее? Может нельзя использовать константы используя СИ??
|
|
|
|
cirus |
21.12.2018, 2:11
|

         
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26363
Пользователь №: 16.971
Возраст: 29

|
Раз уж тесты на скорость, зачем repeat, когда есть while. код
Код --lua local ffi=require "ffi" log "clear" log "mode compact" local n=ffi.new("uint32_t[3]") local x,y,z=ffi.new("uint32_t"),ffi.new("uint32_t"),ffi.new("uint32_t") x,y,z=0,0,0 tmc=os.clock() repeat x=x+1 repeat y=y+1 if y>x then z=1 else z=2 end until y>100000000 until x>100000000 log(os.clock()-tmc)
x,y,z=0,0,0 tmc=os.clock() while x<=100000000 do x=x+1 while y<=100000000 do y=y+1 if y>x then z=1 else z=2 end end end log(os.clock()-tmc) stop_script()
|
|
|
|
DarkMaster |
21.12.2018, 2:13
|
          
Модератор UOPilot
Сообщений: 9.764
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29941
Пользователь №: 11.279

|
Цитата У меня получается медленнее на СИ-шных, на массиве разница вообще очевидная. Я над этим на самом деле очень долго голову ломал. Так ничего умного и не понял. Вообще судя по докам там должно быть промежуточное приведение к double, что существенно должно замедлять скорость работы. Однако в тех тестах, что я тут выкладывал получилось совсем не так. Думаю, просто нужно соблюдать типизацию, если хочется скорости. Т.е. все операции производить между одинаковыми типами. Кстати ты проводишь операции над unsigned int 32, который по тестам был самым невероятно тормознутым. Убирай unsigned, если пролазит максимальное значение. Там даже int 64 был шустрее(или столько же?), чем unsigned int 32. Если значения позволяют, то уменьшай до 8/16 бит.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
sutra |
21.12.2018, 2:37
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Огромное спасибо. Две пилюли есть, вместо репита вайл и вместо массива - переменные. Прирост будет супер. Цитата Возможно if'ы все тормозят ибо хз как их там реализовывали Да, там действительно не совсем понятно, наверняка есть приведение типов. Только на своём финде я прирост получил. Надо проверять каждый оператор. Живой пример подкинул Cirus. В рядовом случае семь раз наплевать, но при поиске картинок миллионы пикселей ворочать приходится, там надо делать всё предельно аккуратно. Кстати, про типы. На вайле пока не проверял, но на репите, если поставить вместо > ==, то будет бесконечный цикл, видимо там не целочисленное значение получается. А вот на вайле - целочисленный индекс. Возможно из-за этого репит так тормозит, потому что делают то одно и то же. Короче костылей тут хватает, надо проверять ну абсолютно ВСЁ. Это братцы не Паскаль. Ещё раз парни спасибо, за науку.
|
|
|
|
sutra |
21.12.2018, 16:57
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Цитата А ты стариной не тряхнешь и не перепишешь этот кусок на асме в итоге?) Не поверишь, честно, думал и про это. Только я всё уже забыл, да и не стоит эта хрень таких трудозатрат. Кстати, про массивы и for-ы. Тычусь в другой своей функции и не поверишь, на массивах и форах работает быстрее, чем на переменных и вайлах. Ни хрена я не понимаю. Надо знать всю архитектуру ОТ и ДО. А наугад и результат соответствующий. Одна какая-нибудь переменная не того типа может "загубить" всё. Радует одно, всё работает, работает несопоставимо быстрее. Скорее это уже начинает работать мой максимализм. Но я наверное плюну на мелочи, я же не на продажу делаю, хотя вещь получилась достойнейшая даже на Пилотовском языке. Осталось доделать разве что перезагрузку компьютера (у меня такого ещё не было, стоит бесперебойник какой надо) и запуск Пилота с того места, какое будет актуальным.
|
|
|
|
|
  |
9 чел. читают эту тему (гостей: 9, скрытых пользователей: 0)
Пользователей: 0
|
|