Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1729 • Страница 83 из 87<  1 ... 80  81  82  83  84  85  86  87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
zanac писал(а):
где можно почитать о такой оптимизации?

У Агнера Фога некоторое количество внимания этому уделено, можете вообще поискать. Не припомню для целочисленного деления каких-то общих правил как его устранить, нужно по ситуации смотреть - исключение это деление на степени двойки, но тут почти что всегда компилятор может отработать и сам деление заменить побитовым сдвигом
В данном случае можно оптимизировать определение длины числа в символах - делать это только при переходах через определённые границы( 1000, 100, 10 ) - после перехода например через 10000 и до перехода через 1000 длина известна и не меняется. Немного прогу усложнит но будет уже куда быстрее
Если вдруг мне станет не лень, напишу свой код и постараюсь сделать его поскоростнее



Партнер
 

Junior
Статус: Не в сети
Регистрация: 09.02.2013
Цитата:
Вобщем стоит учиться обходиться без него


Видимо поэтому и рекомендуется избегать обучения через форумы?
С++ - не ассемблер, за оптимизацию перетряхиванием вычислений здесь по голове не гладят. Концепция высокоуровневого языка и подразумевает что подобную работу следует оставлять автоматике а не делать её частью программы.

Цитата:
Можно как-нибудь ускорить работу программы.

Я бы попробовал работать с числами в двоично-десятичном представлении.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Rpahut писал(а):
С++ - не ассемблер, за оптимизацию перетряхиванием вычислений здесь по голове не гладят. Концепция высокоуровневого языка и подразумевает что подобную работу следует оставлять автоматике а не делать её частью программы.

Видимо поэтому и рекомендуется избегать обучения через форумы?
За подобные утверждения в приличных обществах рвут на части. Загляните даже в стандартные библиотеки, например математическая библиотека DirectX - там деление Явно заменяется на умножение. Компилятор очень многого сделать не может, очень многого делать не будет, например если указано строгое следование IEEE-754 для fp, заменять деление умножением он не будет. А если деление не на константу, что компилятор сделать должен? Это всё работа программиста
Оптимизация которую я предлагал - не работа для компилятора
Кстати VS2010 целочисленное деление на 10 заменяет и деление не использует, но всё равно получается очень дорого - пускай уже намного лучше

Добавлено спустя 50 минут 17 секунд:
Нашёл гайд по оптимизации от Intel чисто чтобы узнать их мнение по поводу деления
Цитата:
Modern compilers typically can transform high-level language expression involving
integer division where the divisor is a known integer constant at compile time into a
faster sequence using IMUL instruction instead. Thus programmers should minimize
integer division expression with divisor whose value can not be known at compile
time.

Идите ещё перед Интел выпендритесь по поводу что у нас тут не Ассемблер и по голове за такое не погладят


 

Junior
Статус: Не в сети
Регистрация: 09.02.2013
Цитата:
За подобные утверждения в приличных обществах рвут на части.

Предположу что в приличных обществах не рвут на части ни за какие утверждения, но может и на это найдётся опровергающая цитата. И у меня нет исходников DX, хотя это не важно - если у человека в руках микроскоп и гвоздь, я решу что он либо взял не тот инструмент, либо применяет его не для той работы, и нет авторитета который сможет меня переубедить.

"Фишка" C++ - ясность и однозначность кода. Колдование над арифметикой, всякие хаки и трюки идут против этой основной концепции и ясность нарушают, что рано или поздно приводит к самым разным проблемам. Даже если пишется небольшой кусок кода без планов его снова использовать, нет никакой гарантии что завтра или через месяц или через год его не придётся достраивать или использовать в другом проекте. А через год или скорее всего гораздо раньше вы сами не сможете разобрать что и как этот оптимизированный код делает, не говоря уже о других людях которым придётся иметь с ним дело.

С++ существует для построения программ с высокой сложностью, он оперирует объектами и связями, а не ячейками памяти и операциями. Умножение и деление в нём равноправны - разница между ними абстрагирована и оставлена за пределами языка, намеренно. Есть вещи, которые этот язык не должен делать, например отвечать за оптимальную компиляцию. И по любому этим не должен заниматься программист - если вы думаете что справитесь лучше автоматики, попробуйте писать в машинном коде.

Пусть за компиляцию отвечает компилятор, я вижу в таком распределении куда больше смысла. Он может и не выдаст идеальный результат, но подойдёт к нему гораздо ближе чем человек.

Между тем сам код можно хорошо ускорить и "легальными" приёмами, например через оптимизацию алгоритма - с этого стоит начинать. Потом - распараллелить работу по потокам, развернуть циклы, кешировать и повторно использовать результаты. Потом уже, если больше совсем ничего сделать нельзя а скорости по прежнему не достаточно, вынимаются гайды по оптимизации "под процессор". Но это в любом случае крайняя мера, крупный геморрой, который должен быть обоснован необходимостью и обеспечен ресурсами. Полагаю у Microsoft достаточно причин оптимизировать библиотеки DX до предела, и уж наверняка достаточно опытных программистов чтобы сделать эту работу правильно и на самом деле получить от неё пользу.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Rpahut писал(а):
Предположу что в приличных обществах не рвут на части ни за какие утверждения

Рвут чтобы не допустить превращения общества в сброд
Rpahut писал(а):
С++ существует для построения программ с высокой сложностью, он оперирует объектами и связями, а не ячейками памяти и операциями

Это утверждение как будто тут речь про Java, С++ это всё ещё скорость, и это одно из главных преимуществ языка. Если не брать в расчёт скорость, то почему бы не пойти и написать прогу на Java или на C#, легче жить ведь?
Rpahut писал(а):
Есть вещи, которые этот язык не должен делать, например отвечать за оптимальную компиляцию

Не обязан, но С++ используется для многих критичных к производительности приложений, вроде игровых движков. Не было бы скорости, С++ пошёл бы лесом при этом выборе
Rpahut писал(а):
оптимизацию алгоритма - с этого стоит начинать

Избавление от деления тоже может быть частью оптимизации алгоритма
Rpahut писал(а):
достаточно опытных программистов

Для этого не нужен опытный программист, пускай опытный программист принимает решения по архитектуре проекта например, тут достаточно обычного кодера
Rpahut писал(а):
Пусть за компиляцию отвечает компилятор

Как я уже писал, у компилятора связаны руки, он не знает для чего ваш код и многих вещей оптимизировать не сможет. Которые при этом прекрасно могут быть оптимизированы программистом. И за компилятором нужен глаз да глаз - он может решить развернуть цикл с гигантским телом получив функцию в несколько килобайт и паршивую скорость, может самые простые вычисления в суперкритичном для производительности месте засрать что вы получите скорость не ахти. Это всё примеры из реальных проектов и при компиляции современными компиляторами. Вы предлагаете перенести ответственность на компилятор полностью за скорость кода - so, good luck вашим программам
Всё это очень трогательная история, на самом деле, от человека который похоже лишь в теории знаком с разработкой критичных к производительности приложений


 

Member
Статус: Не в сети
Регистрация: 27.12.2011
Откуда: Краснодар
Industrialice Здорова. У меня к тебе вопрос.
Есть учебник вот. С него нужно выковырять текст занятий. Как это сделать? Ну или как сделать чтобы с формы можно было копировать?


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
silent_assassin с занятия 8 текст можно скопировать - видно там у контрола забыли свойство поменять. Вообще-то это вроде как pdf, но файлы из ресурсов риадером не открываются. Я погляжу чуть позже подробнее


Последний раз редактировалось Industrialice 19.02.2013 16:51, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 27.12.2011
Откуда: Краснодар
Industrialice писал(а):
silent_assassin с занятия 8 текст можно скопировать - видно там у контрола забыли свойство поменять. Вообще-то это не то djvu, не то pdf, но файлы из ресурсов ни как то ни как другое не открываются. Я погляжу чуть позже подробнее

Спасибо буду ждать.
Там еще есть тема то что по истечении определенного времени программа пишет ошибку, истек срок действия, можно ли это как то отключить?


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
silent_assassin писал(а):
можно ли это как то отключить?

В файле r.res хранится срок окончания, самое простое это наугад поменять значения, заработает - ок. Сложнее - прогу хакнуть, не думаю что там какая-то вразумительная защита и на это заметное количество времени нужно. Это я тоже потом гляну


 

Junior
Статус: Не в сети
Регистрация: 09.02.2013
@Industrialice
Уверяю, у меня есть практический опыт, и не только с кодом критичным по скорости а немного более широкий.

У Java есть своё место - там, где переносимость ставится выше скорости. При обратном распределении приоритетов берут C++, как раз как вы и говорите чтобы получить более высокую скорость - но не за счёт хаков а за счёт построения нативного кода. Ведь от деления можно было бы и в Java избавиться, разве нет?

Компилятору не требуется знать что вы хотите получить от кода чтобы выполнить оптимизацию. Ни на одном этапе машина не понимает смысла программы, однако тот же компилятор VC способен проанализировать исходный код и перестроить вычисления. Да, есть компиляторы не способные выполнить ту же работу, есть ключи, которыми можно оптимизацию отключить - это проблемы выбора подходящего инструмента и его правильного использования. Сегодня замена арифметических операций вручную - труд бесполезный, а в некоторых случаях и вредный, т.к. он может сбить с толку заточенную под "нормальный" код оптимизацию. Не говоря о том что помимо компилятора с кодом всегда работают и люди - об этом почему-то часто забывают - а им в отличии от автоматики нужно видеть в коде смысл чтобы его понимать.

Даже если вы учитесь у "самого" Агнера Фога, чтобы понять когда применять эти знания а когда нет всё равно нужно иметь свою голову. Я бы сказал что быть категоричным к чужим убеждениям и некритичным к собственным - ваше право, но вы ведь распространяете свои заблуждения, на что закрыть глаза я не могу. Никто не даст гарантии что мне не придётся когда-нибудь иметь дело с кодом, оптимизированным по вашим советам.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Rpahut писал(а):
Ведь от деления можно было бы и в Java избавиться, разве нет?

Можно конечно, но на Java вроде как стараются критичный к производительности код в принципе не писать
Rpahut писал(а):
тот же компилятор VC способен проанализировать исходный код и перестроить вычисления

И не более того. Менять логику он в большинстве случаев не будет. Если изначальная логика алгоритма предполагает большое количество тяжёлых операций типа целочисленного деления, если деление не на константу, компилятор почти что всегда ничего не сделает и так и скомпилирует программу с делением. Да даже если на константу, но константа не степень двойки, деление не будет использовано но всё равно будет использована дорогостоящая замена. В данном случае работа программиста изменить логику так чтобы избежать деления и никто кроме программиста её не может сделать. И вообще таких ситуаций очень много
Rpahut писал(а):
Не говоря о том что помимо компилятора с кодом всегда работают и люди - об этом почему-то часто забывают

Код выполнять программному обеспечению, а программисту вы можете оставить комментарии, блок-схему, исходный неоптимизированный вариант, что хотите, не обязательно засирать производительность чтобы получить читаемый код. Тем более в местах где эта производительность реально очень важна. И вообще далеко не всегда оптимизированный вариант будет читаться реально хуже
Rpahut писал(а):
Сегодня замена арифметических операций вручную - труд бесполезный

Да это буллщит. Иногда даже переписывание кода на Ассемблере необходимо. Опять же простой реальный пример - многие функции CRT написаны на Ассемблере. В Вижуал Студио можно посмотреть исходники CRT, там часто встречаются 2 вида: Си-вариант и Ассемблерный, Си для ознакомления
Rpahut писал(а):
Даже если вы учитесь у "самого" Агнера Фога, чтобы понять когда применять эти знания а когда нет всё равно нужно иметь свою голову

Я не учусь у Фога, я учусь на реальных проектах и вижу как меняется производительность в реальных условиях от разных действий. И заглядываю иногда что пишут гуру типа Фога. Если бы не низкоуровневые оптимизации 3д-движок который я пишу был бы в 2-3 раза медленее, это для примера. Более того, оптимизация сейчас моя профессия - за скорость работы я отвечаю. И вот не надо ла-ла и бла-бла типа я это где-то прочитал и нифига не понял
Rpahut писал(а):
Никто не даст гарантии что мне не придётся когда-нибудь иметь дело с кодом, оптимизированным по вашим советам

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

Добавлено спустя 1 час 39 минут 40 секунд:
silent_assassin писал(а):
Там еще есть тема то что по истечении определенного времени программа пишет ошибку, истек срок действия, можно ли это как то отключить?

Прога - ограничение по времени я снял, в данной версии файл r.res должен быть, и ему нужно выставить аттрибут ReadOnly - иначе прога будет его удалять. Я пока не нашёл как это пофиксить, но ограничения по дате теперь нету


 

Member
Статус: Не в сети
Регистрация: 27.12.2011
Откуда: Краснодар
Industrialice писал(а):
Прога - ограничение по времени я снял, в данной версии файл r.res должен быть, и ему нужно выставить аттрибут ReadOnly - иначе прога будет его удалять. Я пока не нашёл как это пофиксить, но ограничения по дате теперь нету


Ты это с помощью вижуал студио делал?


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Небольшой апдейт - теперь ReadOnly можно не ставить
silent_assassin писал(а):
Ты это с помощью вижуал студио делал?

Нет, IDA + HEX editor. Вообще-то эти ребята с учёбы наудивление наивны - думают что дадут беззащитную прогу с ограничениями программистам и все будут играть по их правилам


Последний раз редактировалось Industrialice 19.02.2013 21:39, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 27.12.2011
Откуда: Краснодар
Industrialice
НУ нас пока в такие дебри не загоняли. Я его ковырял чрез vs2010
там тоже 16ричный код вроде можно ковырять.


 

Junior
Статус: Не в сети
Регистрация: 09.02.2013
@Industrialice Ну, давайте я тоже цитат понащипаю и посмотрим что у меня получится.

Цитата:
Можно конечно, но на Java вроде как стараются критичный к производительности код в принципе не писать

Это я не совсем понял. Вы противопоставили два языка, мол фишка C++ скорость, а для "ясности" есть Java. Я указал что Java медленнее потому что программа выполняется на виртуальной машине, а вовсе не потому что C++ якобы создан для скорости. Быть может С++ достаточно быстр чтобы заметить в нём прирост от замены деления, но этот приём ему так же чужд как и Джаве.

Цитата:
Если изначальная логика алгоритма предполагает большое количество тяжёлых операций

то - следует оптимизировать в первую очередь алгоритм а не перепахивать код.

Цитата:
не обязательно засирать производительность чтобы получить читаемый код

Ваша позиция - обязательно делать наоборот?

Цитата:
Тем более в местах где эта производительность реально очень важна.

Вот это важный момент. Вы по характеру работы имеете дело именно с этой стороной разработки. Чтобы никто случайно не упустил из виду - есть и другие стороны. Тех мест где производительность реально и очень важна далеко не большинство. Вы сами называли математические библиотеки, ещё есть низкоуровневый код на маломощных устройствах... Больше ничего в голову не идёт.
У каждого приёма есть своя область применения. Вот это "реально очень" по сути описывает область применения того что вы человеку посоветовали. Только вы не сообщили что это самый крайний этап оптимизации (или я проглядел?), а он не дай бог возьмёт в голову что так и нужно писать, всегда и везде.

Цитата:
Если бы не низкоуровневые оптимизации 3д-движок который я пишу был бы в 2-3 раза медленее

200% прироста это минимум для недеструктивной высокоуровневой оптимизации, без которого я за неё даже не будут браться.

Цитата:
ничего плохого в быстром коде нету

Программисты С++ не против быстрого кода, поэтому они и пишут на C++. Но они как правило против кода страшного - и это тоже причина по которой они пишут на C++. Если бы всё дело было в одной только производительности, после ассемблера других языков просто не стали бы разрабатывать.

Повторюсь - есть места где заточка "под процессор" себя оправдывает, но замена операции деления ради скорости это ни разу не общий, практически полезный совет. В 99% конкретных случаев в C++ деление+ясность принесут больше практической пользы чем замена+ускорение.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Rpahut писал(а):
то - следует оптимизировать в первую очередь алгоритм а не перепахивать код

Алгоритм который нужно оптимизировать нередко будет уже закоден, так что куда без перепахивания-то
Rpahut писал(а):
Ваша позиция - обязательно делать наоборот?

Везде нужно смотреть по ситуации
Rpahut писал(а):
Только вы не сообщили что это самый крайний этап оптимизации

Самый крайний этап это написание кода на Ассемблере, тут до этого ещё далеко. Любому программирующему человеку самому понятно Где нужно оптимизировать, в конце-концов для этого есть куча инструментов, но обычно непонятно Как
Rpahut писал(а):
В 99% конкретных случаев в C++

Логично, в большинстве проектов реально критичного к производительности кода всего чуть
Rpahut писал(а):
Если бы всё дело было в одной только производительности, после ассемблера других языков просто не стали бы разрабатывать

А вот не нужно утрировать, язык выбирается адекватный проекту. Например если высвободившееся время на написание кода на С++ по сравнению с Си направить на оптимизацию критичных участков, профита может быть даже больше от С++ чем если бы мы выбрали быстрый и простой Си. Но я С++ всё равно не люблю
Rpahut писал(а):
200% прироста это минимум для недеструктивной высокоуровневой оптимизации, без которого я за неё даже не будут браться

Опять же, удачи вашим программам и тем кто ими будет пользоваться. Терпения и мощных конфигов заодно. И халявного электричества

Добавлено спустя 3 часа 26 минут 2 секунды:
silent_assassin писал(а):
С него нужно выковырять текст занятий. Как это сделать? Ну или как сделать чтобы с формы можно было копировать?

Я ещё немного поглядел. Не очень продуктивно.
Для отображения содержимого используется почти что наверняка стандартный Delphi-контрол TWebBrowser, который в свою очередь уже юзает Internet Explorer. Контент хранится в формате MHTML, то есть веб-страницы. Нормального способа залочить выделение текста на этом контроле как я понял нету, зацепок нету, как найти в коде места где лочится выделение у меня идей нету - хотя бы потому что я с Delphi дел не имею. Вряд ли в этом направлении что-то может получиться. Проблематично хакнуть код который непонятно где вообще искать и как он может выглядеть
Весь контент похоже запакован в ресурсы, которые потом упаковываются в дельфийный формат TPF0, как оттуда достать и насколько это просто я не успел выяснить. Во время работы из ресурсов контент распаковывается. На диск? Internet Explorer определяет положение именно как на диске, указывает путь который выглядит верным. Файлов там конечно же нету, если посмотреть активность процесса видно что он пытается получить доступ к файлам с этими путями и получает ошибку - файла с таким путём не существует. В чём тут прикол непонятно, если всё это распаковывается на диск то это большой фейл что я проморгал - на самом деле вряд ли
Я с API Internet Explorer не работал, если там есть возможность сохранить открытую страницу то это скорее всего самый простой способ. Ну может быть есть что-то проще, однако как-то всё запарно получается
Ну а пишу я это к тому что вряд ли до выходных будет ещё время с этим посидеть, так что можешь сам попробовать разобраться
P.S. содежание учебника - какая-то чушь. Я бы такой предмет нафиг прогулял


 

Member
Статус: Не в сети
Регистрация: 27.12.2011
Откуда: Краснодар
Industrialice как правильно написать cos2x+25?
я думаю что можно так: cos(2*x)+25 :?:


 

Member
Статус: Не в сети
Регистрация: 31.05.2010
Откуда: Минск
Что осуществляет запись в правой части :
iArg1 = *(int*)aArg1;
iArg1 объявлена как член класса : int iArg1;
Я не знаю как это понимать.

_________________
Идущий осилит дорогу


 

Member
Статус: Не в сети
Регистрация: 17.10.2005
Откуда: Киров-ННовгород
zanac
каст aArg1 к указателю на int, затем взятие значения (типа int) по этому указателю.


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Можно было написать что такое aArg1, я так понимаю массив чего-то


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1729 • Страница 83 из 87<  1 ... 80  81  82  83  84  85  86  87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  



Лаборатория














Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan