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

Вопрос оптимизации

Вопрос

Добрый день, игроки.

 

Возник вот какой вопрос. Какой из двух вариантов кода использовать.

Первый я назвал "математическим" и выглядит он так:

--local table={}
for i=1, 20 do
	for j=1, 50 do
                local n = (i-1)*50+j
		--table[n]={i,j}
                ...
                <<Какой то код, использующий переменную n>>
                ...
	end
end
return table
 

Второй я назвал вариантом "программиста" и выглядит он так:

--local table={}
local n=0
for i=1, 20 do
	for j=1, 50 do
		n=n+1
		--table[n]={i,j}
                ...
                <<Какой то код, использующий переменную n>>
                ...
	end
end
return table 

Как мы видим, мы проходим по координатам и записываем их в таблицу вычисляем переменную n разными способами. Но разница состоит в том, использовать ли при этом лишнюю переменную счётчика или нет.

 

А теперь напишите в комментариях, какой код лучше и почему.

Изменено пользователем qwertyMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

table.insert(table,{i,j})

Меня интересовала именно альтернатива счётчика, работает ли она лучше. Так что условия задачи я изменил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Меня интересовала именно альтернатива счётчика, работает ли она лучше. Так что условия задачи я изменил.

table.insert(table, {i, j})
do_something_with(#table)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

+4 байта к оперативной памяти, либо +2 операции

тут нужно решать что важнее, память или скорость.

хотя учитывая что это код на луа, плхоже будет использоваться в ОС, разницы особой быть не должно, скорость не будет заметна учитывая супер скорость майна, а из памяти гцшка сожрет твои 4 байта, если в ду енд запихнешь код с счетчиком и циклом

--local table={}
do
  local n=0
  for i=1, 20 do
    for j=1, 50 do
      n=n+1
      --table[n]={i,j}
      ...
    end
  end
end
return table

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@qwertyMAN, а разве @Zer0Galaxy не указал способ измерений в твоей предыдущей теме?

local a,b,c = 100,200,0
for i=1,ci do c=(a-1)*50+b end
for i=1,ci do c=c+1        end
Второй цикл в среднем выполняется раза в два быстрее первого. Реальная разница будет не так сильно заметна, т.к. её будет размывать время выполнения других операций.

 

+4 байта к оперативной памяти, либо +2 операции

тут нужно решать что важнее, память или скорость.

хотя учитывая что это код на луа, плхоже будет использоваться в ОС, разницы особой быть не должно, скорость не будет заметна учитывая супер скорость майна, а из памяти гцшка сожрет твои 4 байта, если в ду енд запихнешь код с счетчиком и циклом

Тут не просто +2 операции, это две операции в цикле. А +4 байта так и останутся всего лишь 4 байтами, которые так или иначе всё равно будут задействованы. Вопрос лишь в том, насколько важно их освободить по завершении цикла.

Кроме +2 операций следует учесть задействование +2 переменных и +1 константы, что даже в ассемблере будет весьма заметно, не говоря уже о Lua с ее сложной системой доступа к переменным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...