nic666
offline
Опыт:
5,612Активность: |
DioD
просто "оптимизировать алгоритм" такого понятия нет. Можно оптимизировать алгоритм ПО КРИТЕРИЮ. Известные критерии: скорость выполнения, экономия памяти, компактность кода. Я и спрашивал о КРИТЕРИИ! Вы конечно могли иметь ввиду ВООБЩЕМ, то есть как лучше. Но лучше - это понятие относительное. Например, есть фанаты скорости, а есть фанаты компактности кода. Для каждого из них лучшее - это своЁ! Как вы оцениваете что лучше? Если вы сравниваете объем результата в байтах, то вы по компактности, если засекаете время работы - то по скорости. Что касается УТЕЧЕК: - это конкретно ошибки в реализации джаса или пользовательского кода. Исправление ошибок к оптимизации отношения не имеет, это качественно иной процесс. Сейчас я вам выложу пару решений по предыдущему примеру, которые по-своему хороши. |
11.01.2007, 10:54 | #21
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
красивый код != правильный
о оптимизации кода по его длине речи быть не может
код что вызывает засорение памяти уже неоптимален, так как некорректно использует память. |
11.01.2007, 10:58 | #22
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
утечка=ошибка
ошибка=нет кода нет кода=оптимизировать нечего Две разные вещи: 1) Исправление ошибок 2) оптимизация Код:
Вот вам код function GetMyTime... он ПО-СВОЕМУ оптимален. А в кэш надо писать udg_TimeStamp и не каждую секунду, а только когда надо nic666 добавил: Это был пример комактности, сейчас могу сделать пример оптимизации скорости. Только крутится два варианта кода незнаю какой выбрать 1) объем около 30 кб 2) объем около 690кб Вам какой сделать? тот что быстрее? |
11.01.2007, 11:10 | #23
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
давай все, потом оценим |
11.01.2007, 11:18 | #24
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Еще вопрос:
зачем читать из кеша значение TimeStamp каждую секунду? Ведь гораздо эффективнее хранить копию этой величины в глобальной переменной. Щас сделаю пример на 30Кб, а на 690Кб это по-моему уже безумно тратить на одну функцию столько объема...
а безумие это иное качественное состояние и к оптимизации мало подходит. Щас выложу минут через 20... |
11.01.2007, 11:22 | #25
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
если функция считает время в секундах, надо учесть поведение при запусках 100 раз в секунду и если запускает раз в час тоже |
11.01.2007, 11:34 | #26
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Цитата:
Может быть имеет смысл писать время в кэш каждую секунду, если кеш периодически сбрасывается в файл, чтобы потом восстановить... Но читать надо один раз - при запуске карты. Вот вам tot пример GetMyTime? но вообще-то карта с ним почему-то стала весить 80кб, когда тестировал... Код:
Как видите в самой функции нет ничего кроме сложений и обращения к массивам! Обращение к массивам это по сути сложение и умножение на 4. Но все равно это быстрее, чем все что здесь опубликовано выше... Чуть не забыл глобалки Hour, MinSec - целые N - массив целых ToS - массив строк Прилагаю полный код атачем, так не влазит....... |
|
11.01.2007, 12:16 | #27
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
nic666, а почему ты присваиваешь не через loop?
|
11.01.2007, 12:22 | #28
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
а так быстрее ;) |
11.01.2007, 12:25 | #29
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
nic666, а размер кода? Оно то может и быстрее, но я бы изпользовал циклы)
|
11.01.2007, 12:28 | #30
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
спайка строк бред, надо было так делать
S[0] = " <00:00:00> " S[1] = " <00:00:01> " / S[3599] = " <00:59:59> " |
11.01.2007, 12:46 | #31
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
ADOLF так читай выше...я тут и тру о том, что задача неточно поставлена. Увеличение объема при оптимизации скорости - это очень частое явление.
А вот промежуточный вариант карта с ним весит всего 18кб, но он чуть медленее предыдущего... Код:
Переменные udg_Hour , udg_Min, udg_Sec целые udg_N массив целых udg_ToS массив строк Я бы этот все таки предпочел предыдущему... nic666 добавил: Цитата:
Если это бред и часов всегда НОЛЬ, то зачем тебе переменная Hour вообще? Тогда ее можно выкинуть. Именно вариант с 8 значными строками от 00:00:00 до 23:59:59 я и хотел предложить, по моим подсчетам он бы весил 690кб. А ограничение массива на 8191 элемент можно обойти, используя несколько массивов, или выделяя части из одной строки. nic666 добавил: Нет пожалуй на 690кб вариант быстрее не будет, там на обход ограничения 8192 портебуется дополнительный код... nic666 добавил: Ну вот последний вариант по пожелпниям ADOLF через loop то есть компактный и такой же быстрый Код:
Отредактировано nic666, 11.01.2007 в 16:22. |
|
11.01.2007, 14:05 | #32
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
herr_horror
Фиолетовый андроид
offline
Опыт:
139Активность: |
Нашел неплохой вариант. Что-то навеяло из курса дискретной математики...
Код:
Отредактировано herr_horror, 11.01.2007 в 15:15. |
11.01.2007, 15:09 | #33
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Цитата:
no comment Jon добавил: Цитата:
№-1? будут другие? когда? |
||
11.01.2007, 16:07 | #34
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
Ай яй яй... исправил в своем последнем варианте
Код:
а было Код:
Вообщем именно свой последний вариант я и считаю самым лучшим. |
11.01.2007, 16:25 | #35
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
herr_horror
Фиолетовый андроид
offline
Опыт:
139Активность: |
Цитата:
Я более у2.718281828459045бищного синтаксиса в жизни не видел! Я вообще уже сомневаюсь, что джасс - Тьюринг-полный язык. Еле удержался, чтобы не написать нормальным языком. Не знаю, как создается локальный массив! Не знаю! Тут я не нашел. Предположил, что так. Поправь, я тебе спасибо скажу. |
|
11.01.2007, 16:39 | #36
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Цитата:
local <тип> array <название> обнулять сразу весь цыкл нельзя.. только по элементам (целочисленый масив обнулять null-ом тоже не рекомендую) |
|
11.01.2007, 16:51 | #37
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
herr_horror
Фиолетовый андроид
offline
Опыт:
139Активность: |
Цитата:
Понял спасибо, буду знать. Так стоп! А почему обнулять локальные .. вообще надо? Они же локальные! Они живы только внутри двух операторных скобок : начало функции - конец_функции. Любая переменная, объявленная как локал - должна быть в стеке, стало быть по рету эта память будет недоступна. Даже если близардовцы сделали велосипед с квадратными колесами, тут должно быть что-то вроде GarbageCollection? Я например был приятно удивлен, когда нашел что можно на джазе создавать потоки, они что ли вообще не чистятся никак? Да.. и массив это же только указатель на первый элемент. Его грохнуть ВСЕГДА было проще папиной репы. Джаз меня удивляет! Ладно. кончаю оффтоп. В общем АЛГОРИТМИЧЕСКИ ДАННЫЙ ПРИМЕР можно оптимизировать так: Код:
Пойду жрать. |
|
11.01.2007, 17:00 | #38
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
тем кто пошел кушать - бон аппетит, остальные думайте, я пока подготовлю то что вроде как я хотел вам поведать как первую стадию оптимизации.
ПС больше 24 часов не бывает, так что если пройдёт 3600*24 секунд надо будет сбросить их до нуля, что не сложно. Код:
Взял то что было ближе 1) Секунды меняются раз в секунду, поэтому считывать каждую секунду часы и минуты нецелесообразно. Первая стадия это именно чтение по необходимости, а не постоянно. Так же как и записать Читать если требуется и записывать так же Надеюсь это понятно? |
12.01.2007, 02:47 | #39
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
5,612Активность: |
DioD
Я давно тебе говорил, что в периодическом триггере не должно быть никаких чтений из кеша ВООБЩЕ! Надо копии хранить в глобалках и их модифицировать. На крайний случай можно записывать в кеш, но и это не стоит делать раз в секунду. Лучше сделать еще один триггер и сохранять все что надо 1 раз в минуту, или 5 минут. nic666 добавил: P.S. Если кто не знает, то кеш придуман близардом для компаний, чтобы переносить элементы между миссиями. Изначально никаких гарантий его скоростной работы небыло. И он и работает в 10-100 раз медленее чем массивы и глобалки... скорость работы зависит от заполненности |
12.01.2007, 10:44 | #40
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|