Re[9]: [Investigation] Exceptions vs. Return Values
От: remark Россия http://www.1024cores.net/
Дата: 02.04.07 11:32
Оценка: +1
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, remark, Вы писали:


R>>О чём вы вообще говорите?! Ну не может код выполняться на разных процессорах/ядрах, если всего один процессор и одно ядро!У

CC>У меня например 1 проц — 2 ядра... При особом желании могу нарыть как 2 процессорную так и четырехядерную машины... На них еще как может.

Либо я чего-то не понимаю...
То, что ты можешь нарыть 2 процессорную тачку никак не сказывается на том, будет ли у меня погрешность измерений, если я на одноядерной тачке не привяжу потоки к ядрам.
На одноядерной тачке не надо ничего привязывать. Я учёл все ньюансы, адекватные в конкретной ситуации. Если бы я запускал на многоядерной такчке, тогда бы я парился по поводу привязки и т.д.
Я не понимаю о чём речь. Почему Andrew S говорит, что я забыл сделать какую-то привязку, поднять приоритеты и т.д. Слов просто нет.
Не знаю даже, что вам ещё сказать. Или если вы тут о чём-то своём говорите, типа "как мы будем мерить производительность на многоядерной тачке", то то не говорите, что я что-то забыл.


R>>И не может так быть, что бы кусок кода, выполняемый 24 такта 1000 раз подряд, каждый из этих 1000 раз прерывался таймером.

CC>Колво циклов надо увеличить по любому — слишком мало — будет сказываться погрешность измерений.

Именно поэтому потом я делал замеры в "асимптотическом" случае.

R>>

CC>разумеется

1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: [Investigation] Exceptions vs. Return Values
От: Константин Л. Франция  
Дата: 02.04.07 11:50
Оценка:
Здравствуйте, remark, Вы писали:

[]

R>Я не понимаю о чём речь. Почему Andrew S говорит, что я забыл сделать какую-то привязку, поднять приоритеты и т.д. Слов просто нет.

R>Не знаю даже, что вам ещё сказать. Или если вы тут о чём-то своём говорите, типа "как мы будем мерить производительность на многоядерной тачке", то то не говорите, что я что-то забыл.

ну это он для надежности. Вдруг какой-либо другой поток вклинится в подсчитанные такты.

[]
Re[5]: [Investigation] Exceptions vs. Return Values
От: Константин Л. Франция  
Дата: 02.04.07 11:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, remark, Вы писали:


R>>Ты сам себе противоречишь — вначале говоришь, что надо, что б функция что-то делала, а потом, говоришь, что тогда все результаты будут не видны.

R>>Имхо я как раз всё сделал как надо — меряю вклад тогда, когда он виден. А не наоборот.

А>Я хочу сказать, что практическая ценность этого измерения незначительна. Мы же на практике не пишем пустых функций.


А>Ещё я боюсь, что сейчас появится куча людей, утверждающих, что преимущество исключений доказано экспериментально, но забывающих указать в каких условиях оно проявляется. Между тем, написать exception-safe программу ох как непросто.


конечно, поэтому давайте писать простые совсем не exception-safe программы .

Его поинт в том, что сама по себе поддержка исключений вносит практически нулевой оверхэд.

А>Олег Алексеев.


А>
Re[8]: [Investigation] Exceptions vs. Return Values
От: Andrew S Россия http://alchemy-lab.com
Дата: 02.04.07 11:54
Оценка:
R>Что ты хочешь этим сказать? А ты погляди код, который генерируется при вызове функций, возвращающих значения. Там тоже есть код, там не по велению волшебной палочки всё происходит.

Я хочу сказать, что там не 2-3 команды, а десяток довольно толстых как сточки зрения кода, так и данных, команд.

R>Ситуация такая: при использовании исключений у функции есть пролог/эпилог, зато само тело меньше, т.к. нет постоянных проверок.

R>при использовании возвращаемых значнеий — нет пролога/эпилога, зато каждый вызов функции/выделение ресурса обходится дороже.

R>Вот именно это я исследовал. Что же в итоге лучше. Что перевешивает. То, что есть пролог/эпилог — это понятно, понятно, что это всё не за бесплатно.


Чушь. Твоя запись if (!fun()) return val как раз не общий случай. Его я могу оптимизировать до одной проверки на все функции. val1 = fun1() ... valn = funn(); return val1 | val2 | ... | valn. В принципе, это может сделать и сам компилятор (более того, он это хоть и коряво, на пытается при помощи setne сделать). И что это покажет? Я говорю — нужны реальные паттерны.

R>з.ы. кстати, если в функции нет объектов с нетривиальными деструкторами, то исключения выглядят значительно привлекательнее, т.к. и эпилога/пролога нет и вызовы функции дешевле.


Не вышлядят. Блин, ну сколько можно — я ж уже показал, что в этом случае используется ebp стек фрейм. Попробуй лучше исследовать, как это влияет на перфоманс вычислительной функции, а?

Я к чему — пустые функции должны идти в dev\null. Использование исключений значительно влияет на кодогенерацию. Точка.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: [Investigation] Exceptions vs. Return Values
От: rm822 Россия  
Дата: 02.04.07 11:55
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, rm822, Вы писали:


R>>>>Двойка вам за научный подход.


R>Тут основная проблема, что бы сделать тесты справедливые для обоих стратегий.

R>Т.е. что я делаю — беру некую предельно простую абстракцию — ресурс — приписываю ему семантику — его надо выделить, причём выделение может провалится, и его обязательно надо освободить при выходе из функции. Далее я моделирую эту абстракцию на С++ и на С предельно "честно" по отношению к обоим языкам и их возможностям — на С++ — объект с деструктором, на С — функции construct/destroy. И сравниваю именно эти реализации одной и той же задачи разными средствами. Какая реализация быстрее?
R>Сравнивать тёплое с мягким нет смысла.
R>Т.е. нет смысла мерить типа "а что если мы в с++ вставим дополнительный new/delete" — ты тогда и в С вставь тоже что-то, что будет решать ту задачу, для решения которой ты в С++ вставил дополнительный new/delete.
R>Т.е. ты придумай некую абстрактную задачу, которая бы на С++ требовала применения иерархий ошибок/динамического полиморфизма и т.д., потом максимально "честно" вырази её решение на С, причём там, что бы тебе потом не говорили — а я бы это сделал подругому и быстрее. И вот тогда будем мерить, где решение задачи "мега динамической полиморфной обработки ошибок" работает быстрее.

Реальность такова что для обработки исключений используется иерахия классов а не int.(Обычно) Для обработки ошибок error-кодами используется int а не классы. (Обычно) И сравнивать нужно именно теплое с мягким, потому что такова реальность.

R>
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: [Investigation] Exceptions vs. Return Values
От: remark Россия http://www.1024cores.net/
Дата: 02.04.07 12:00
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, remark, Вы писали:


КЛ>[]


R>>Я не понимаю о чём речь. Почему Andrew S говорит, что я забыл сделать какую-то привязку, поднять приоритеты и т.д. Слов просто нет.

R>>Не знаю даже, что вам ещё сказать. Или если вы тут о чём-то своём говорите, типа "как мы будем мерить производительность на многоядерной тачке", то то не говорите, что я что-то забыл.

КЛ>ну это он для надежности. Вдруг какой-либо другой поток вклинится в подсчитанные такты.


Во-первых, thread affinity тут всё равно ни при чём
Во-вторых, от "вклинивания" на win32/linux всё равно никак не защититься

КЛ>[]

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: [Investigation] Exceptions vs. Return Values
От: Andrew S Россия http://alchemy-lab.com
Дата: 02.04.07 12:01
Оценка:
AS>>Ну и где тут реальный код? С трансляцией исключений в собственнные и т.п.? Я не вижу поинта для сравенения, уж извини. Ведь проверка ошибок для этого и используется — чтобы на основе возвращаемого значения сформировать свое. В реальной ситуации с исключениями часто ровно та же задача — у нас есть набор наших исключений и нам надо "чужие" исключения привести к нашим.

R>Ну хорошо, а ты что утверждаешь, что реальный код — это только код с трансляцией исключений?

R>Я надеюсь, что нет. Тогда почему не начать с простого случая?
R>Я тебя уверяю, что есть множество кода, который никакими трансляциями не занимается.

А я тебя уверяю в обратном. Сравни std и com исключения. Обычно в проекте своя иерархия исключений, и они транслируются на разных уровнях вызова. Как в этом случае добиться преймущества от исключений на уровне вызова библиотечных методов\функций — вопрос интересный.

AS>>>>Понятно. Ну, что ж, могу лишь сказать, что это по меньшей мере неверно. Надо привязывать поток к одному ядру и устанавливать приоритеты на реалтайм — тогда хоть как то можно говорить о нормальном измерении при помощи этой методики.


R>>>Зачем привязывать к единственному ядру? Или ты боишься, что у меня часть вычислений убежало на соседний комп?


AS>>Куда убежать??? Вероятно, про багу с рассинхронизаций rdtsc на разных ядрах ты не слышал?


R>Нет, чтобы на одном ядре таймер сам с собой рассинхронизировался, я не слышал. А что такое бывает?


А при чем тут один. Ты тестировал на одной конфигурации?

R>>>Зачем поднимать приоритеты? Или ты думаешь, что поток с более высоким приоритетом будет выполняться быстрее?


AS>> Круто.


R>Вот я тоже так подумал.


Да. Сильно. А ты не подумал, что выбор минимального из результатов — это в корне неправильный подход к статистике?

R>Мне не жалко трудов, просто проект получился достаточно наколеночный, т.к. когда я начинал, то не собирался делать что-то особо основательное. Но если ты так настаиваешь, сейчас всё это запакую и выложу.


Да нет, я не настаиваю. Просто если ты хочешь называть это исследованием и чтобы его результаты имели практическую ценность и обоснованность — должен быть виден код, который приводит к таким результатам. Скажи честно, ты смотрел для каждого варианта то, что генерит компилятор на уровне ассемблера? Ты разбирался как каждый из них работает с исключениями и с возвращающими значениями и влияние этого на кодогенерацию в целом? А ведь это все нужно, чтобы не просто статистику поиметь, а сделать из нее выводы — самое ценное, что есть в исследовании. Я выводов пока (как и самого исследования) пока тут не вижу, уж извини.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: [Investigation] Exceptions vs. Return Values
От: remark Россия http://www.1024cores.net/
Дата: 02.04.07 12:04
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Его поинт в том, что сама по себе поддержка исключений вносит практически нулевой оверхэд.


Если бы более точным, то я хочу померить оверхед обработки ошибок отдельно Допустим получается 100нс/1000 строк кода при использовании кодов возврата и 95нс/1000 строк кода.
Дальше каждый сам волен решать — важно ему это или нет. Важно ли ему эти 5 нс.
Но утвержать, что это просто не важно, имхо, некорректно.

А>>Олег Алексеев.


А>>

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: [Investigation] Exceptions vs. Return Values
От: Константин Л. Франция  
Дата: 02.04.07 12:05
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Ну и где тут реальный код? С трансляцией исключений в собственнные и т.п.? Я не вижу поинта для сравенения, уж извини. Ведь проверка ошибок для этого и используется — чтобы на основе возвращаемого значения сформировать свое. В реальной ситуации с исключениями часто ровно та же задача — у нас есть набор наших исключений и нам надо "чужие" исключения привести к нашим.


R>>Ну хорошо, а ты что утверждаешь, что реальный код — это только код с трансляцией исключений?

R>>Я надеюсь, что нет. Тогда почему не начать с простого случая?
R>>Я тебя уверяю, что есть множество кода, который никакими трансляциями не занимается.

AS>А я тебя уверяю в обратном. Сравни std и com исключения. Обычно в проекте своя иерархия исключений, и они транслируются на разных уровнях вызова. Как в этом случае добиться преймущества от исключений на уровне вызова библиотечных методов\функций — вопрос интересный.


com исключения? это что?
Re[6]: [Investigation] Exceptions vs. Return Values
От: remark Россия http://www.1024cores.net/
Дата: 02.04.07 12:06
Оценка:
Здравствуйте, rm822, Вы писали:

R>Здравствуйте, remark, Вы писали:


R>>Здравствуйте, rm822, Вы писали:


R>>>>>Двойка вам за научный подход.


R>>Тут основная проблема, что бы сделать тесты справедливые для обоих стратегий.

R>>Т.е. что я делаю — беру некую предельно простую абстракцию — ресурс — приписываю ему семантику — его надо выделить, причём выделение может провалится, и его обязательно надо освободить при выходе из функции. Далее я моделирую эту абстракцию на С++ и на С предельно "честно" по отношению к обоим языкам и их возможностям — на С++ — объект с деструктором, на С — функции construct/destroy. И сравниваю именно эти реализации одной и той же задачи разными средствами. Какая реализация быстрее?
R>>Сравнивать тёплое с мягким нет смысла.
R>>Т.е. нет смысла мерить типа "а что если мы в с++ вставим дополнительный new/delete" — ты тогда и в С вставь тоже что-то, что будет решать ту задачу, для решения которой ты в С++ вставил дополнительный new/delete.
R>>Т.е. ты придумай некую абстрактную задачу, которая бы на С++ требовала применения иерархий ошибок/динамического полиморфизма и т.д., потом максимально "честно" вырази её решение на С, причём там, что бы тебе потом не говорили — а я бы это сделал подругому и быстрее. И вот тогда будем мерить, где решение задачи "мега динамической полиморфной обработки ошибок" работает быстрее.

R>Реальность такова что для обработки исключений используется иерахия классов а не int.(Обычно) Для обработки ошибок error-кодами используется int а не классы. (Обычно) И сравнивать нужно именно теплое с мягким, потому что такова реальность.


Обычно и не думают о наносекундах, и что?

R>>

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: [Investigation] Exceptions vs. Return Values
От: Аноним  
Дата: 02.04.07 12:07
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Его поинт в том, что сама по себе поддержка исключений вносит практически нулевой оверхэд.


В чём его поинт, автор уже написал:

>> Цель можно охарактеризовать примерно так: исследовать скорость работы некоторых ключевых паттернов кода, реализованных с применением исключений для сообщения об ошибках, или с помощью возвращаемых значений.


Написание пустых функций не есть "ключевой паттерн кода" (по-моему).

Нулевой оверхэд видел своими глазами (правда только у GCC). Назвать его нулевым по объему дополнительного кода язык не поворачивается. Поверьте, я не ратую за отмену исключений. Я за трезвую оценку и объективные исследования. Думаю, что критические отзывы пойдут только на пользу исследованиям.

Олег Алексеев.
Re[9]: [Investigation] Exceptions vs. Return Values
От: remark Россия http://www.1024cores.net/
Дата: 02.04.07 12:12
Оценка: -1
Здравствуйте, Andrew S, Вы писали:

R>>Что ты хочешь этим сказать? А ты погляди код, который генерируется при вызове функций, возвращающих значения. Там тоже есть код, там не по велению волшебной палочки всё происходит.


AS>Я хочу сказать, что там не 2-3 команды, а десяток довольно толстых как сточки зрения кода, так и данных, команд.


R>>Ситуация такая: при использовании исключений у функции есть пролог/эпилог, зато само тело меньше, т.к. нет постоянных проверок.

R>>при использовании возвращаемых значнеий — нет пролога/эпилога, зато каждый вызов функции/выделение ресурса обходится дороже.

R>>Вот именно это я исследовал. Что же в итоге лучше. Что перевешивает. То, что есть пролог/эпилог — это понятно, понятно, что это всё не за бесплатно.


AS>Чушь. Твоя запись if (!fun()) return val как раз не общий случай. Его я могу оптимизировать до одной проверки на все функции. val1 = fun1() ... valn = funn(); return val1 | val2 | ... | valn. В принципе, это может сделать и сам компилятор (более того, он это хоть и коряво, на пытается при помощи setne сделать). И что это покажет? Я говорю — нужны реальные паттерны.


Это не оптимизация общего случая — пример — вложенные ресурсы.

Ну допустим, я бы потратил пол-года и переписал некий проект bla-bla с одной стратегии на другую и выдал бы в итоге, что с исключениями bla-bla стал работать на 1% быстрее и размер уменьшился на 2%. Ну и что? По-твоему это бы дало больше информации?
Мы же не штампуем целиком проекты, мы пишем отдельные функции — вот тут функци, которая форвардит вызов другой, а вот тут функция, которая вызывает ещё 3 функции, а вот тут функция, которая выделяет ресурс и т.д.


R>>з.ы. кстати, если в функции нет объектов с нетривиальными деструкторами, то исключения выглядят значительно привлекательнее, т.к. и эпилога/пролога нет и вызовы функции дешевле.


AS>Не вышлядят. Блин, ну сколько можно — я ж уже показал, что в этом случае используется ebp стек фрейм. Попробуй лучше исследовать, как это влияет на перфоманс вычислительной функции, а?


А я сколько раз показывал, что код работает на 50% быстрее и занимает на 200% меньше.

AS>Я к чему — пустые функции должны идти в dev\null. Использование исключений значительно влияет на кодогенерацию. Точка.


Так же как и возвращаемые значения. Очевидно. Осталось только понять как.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: [Investigation] Exceptions vs. Return Values
От: Sergey Россия  
Дата: 02.04.07 12:19
Оценка:
Здравствуйте, remark, Вы писали:

R>Аааа. Понял о чём речь.

R>Ну вы же видите результаты, когда исключение кидается — всякие вариации, типа синхронной/асинхронной модели или кидать int или runtime_error, версия рантайма — это уже как мёртвому припарка — кидание исключений СУЩЕСТВЕННО НА МНОГО более медленные. Я не думаю, что из-за настроек время станет вдруг не 20мкс, а 10нс.

Не совсем так. Асинхронная можель обработки исключений в VC (название неудачное, но так уж назвали) означает, что исключение может кинуть любая функция, в том числе сишная. Плюс SEH-исключения будут ловиться по catch(..). Т.е., компилятор просто будет втыкать код для размотки стека в большем количестве случаев. Соответственно, повлияет это и на нормальное исполнение программы, когда исключения не кидаются.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[11]: [Investigation] Exceptions vs. Return Values
От: Andrew S Россия http://alchemy-lab.com
Дата: 02.04.07 12:23
Оценка:
AS>>>>Ну и где тут реальный код? С трансляцией исключений в собственнные и т.п.? Я не вижу поинта для сравенения, уж извини. Ведь проверка ошибок для этого и используется — чтобы на основе возвращаемого значения сформировать свое. В реальной ситуации с исключениями часто ровно та же задача — у нас есть набор наших исключений и нам надо "чужие" исключения привести к нашим.

R>>>Ну хорошо, а ты что утверждаешь, что реальный код — это только код с трансляцией исключений?

R>>>Я надеюсь, что нет. Тогда почему не начать с простого случая?
R>>>Я тебя уверяю, что есть множество кода, который никакими трансляциями не занимается.

AS>>А я тебя уверяю в обратном. Сравни std и com исключения. Обычно в проекте своя иерархия исключений, и они транслируются на разных уровнях вызова. Как в этом случае добиться преймущества от исключений на уровне вызова библиотечных методов\функций — вопрос интересный.


КЛ>com исключения? это что?


Например, COleException. В этом случае мы имеем дело аж с 2-мя враппингами — перевод возвращаемого значения в ole иключение, перевод ole исключения в наше родное. И это все вполне common случай. Я ж говорю — различные библиотечные методы\функции.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: [Investigation] Exceptions vs. Return Values
От: Sergey Россия  
Дата: 02.04.07 12:24
Оценка: 2 (2) +1 :)
Здравствуйте, rm822, Вы писали:

R>>Тут основная проблема, что бы сделать тесты справедливые для обоих стратегий.

R>>Т.е. что я делаю — беру некую предельно простую абстракцию — ресурс — приписываю ему семантику — его надо выделить, причём выделение может провалится, и его обязательно надо освободить при выходе из функции. Далее я моделирую эту абстракцию на С++ и на С предельно "честно" по отношению к обоим языкам и их возможностям — на С++ — объект с деструктором, на С — функции construct/destroy. И сравниваю именно эти реализации одной и той же задачи разными средствами. Какая реализация быстрее?
R>>Сравнивать тёплое с мягким нет смысла.
R>>Т.е. нет смысла мерить типа "а что если мы в с++ вставим дополнительный new/delete" — ты тогда и в С вставь тоже что-то, что будет решать ту задачу, для решения которой ты в С++ вставил дополнительный new/delete.
R>>Т.е. ты придумай некую абстрактную задачу, которая бы на С++ требовала применения иерархий ошибок/динамического полиморфизма и т.д., потом максимально "честно" вырази её решение на С, причём там, что бы тебе потом не говорили — а я бы это сделал подругому и быстрее. И вот тогда будем мерить, где решение задачи "мега динамической полиморфной обработки ошибок" работает быстрее.

R>Реальность такова что для обработки исключений используется иерахия классов а не int.(Обычно) Для обработки ошибок error-кодами используется int а не классы. (Обычно) И сравнивать нужно именно теплое с мягким, потому что такова реальность.


Осталось еще добавить, что при обработке ошибок error-кодами (обычно) как минимум в половине случаев забывают проверять код возврата или не знают что с ним делать, и поэтому программа с обработкой ошибок error-кодами все равно будет быстрее Зато с исключениями — правильнее
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[10]: [Investigation] Exceptions vs. Return Values
От: minorlogic Украина  
Дата: 02.04.07 12:26
Оценка: 1 (1)
Здравствуйте, Andrew S, Вы писали:

AS>Да. Сильно. А ты не подумал, что выбор минимального из результатов — это в корне неправильный подход к статистике?


Статистика тут ни при чем. В подобныъ замерах скорости — интерес представляет только минимальное время выполнения.

AS>Да нет, я не настаиваю. Просто если ты хочешь называть это исследованием и чтобы его результаты имели практическую ценность и обоснованность — должен быть виден код, который приводит к таким результатам. Скажи честно, ты смотрел для каждого варианта то, что генерит компилятор на уровне ассемблера? Ты разбирался как каждый из них работает с исключениями и с возвращающими значениями и влияние этого на кодогенерацию в целом? А ведь это все нужно, чтобы не просто статистику поиметь, а сделать из нее выводы — самое ценное, что есть в исследовании. Я выводов пока (как и самого исследования) пока тут не вижу, уж извини.


То есть у вас есть лучшее тестирование , и вы его зажимаете и не выкладываете ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[10]: [Investigation] Exceptions vs. Return Values
От: Andrew S Россия http://alchemy-lab.com
Дата: 02.04.07 12:30
Оценка:
R>>>Что ты хочешь этим сказать? А ты погляди код, который генерируется при вызове функций, возвращающих значения. Там тоже есть код, там не по велению волшебной палочки всё происходит.

AS>>Я хочу сказать, что там не 2-3 команды, а десяток довольно толстых как сточки зрения кода, так и данных, команд.


R>>>Ситуация такая: при использовании исключений у функции есть пролог/эпилог, зато само тело меньше, т.к. нет постоянных проверок.

R>>>при использовании возвращаемых значнеий — нет пролога/эпилога, зато каждый вызов функции/выделение ресурса обходится дороже.

R>>>Вот именно это я исследовал. Что же в итоге лучше. Что перевешивает. То, что есть пролог/эпилог — это понятно, понятно, что это всё не за бесплатно.


AS>>Чушь. Твоя запись if (!fun()) return val как раз не общий случай. Его я могу оптимизировать до одной проверки на все функции. val1 = fun1() ... valn = funn(); return val1 | val2 | ... | valn. В принципе, это может сделать и сам компилятор (более того, он это хоть и коряво, на пытается при помощи setne сделать). И что это покажет? Я говорю — нужны реальные паттерны.


R>Это не оптимизация общего случая — пример — вложенные ресурсы.


Это оптимизация приведенного тобой примера, в которой переход не требуется вообще...

R>Ну допустим, я бы потратил пол-года и переписал некий проект bla-bla с одной стратегии на другую и выдал бы в итоге, что с исключениями bla-bla стал работать на 1% быстрее и размер уменьшился на 2%. Ну и что? По-твоему это бы дало больше информации?


Не проект. Надо выделить несколько функций различных классов, и уже на их основе анализировать эффект.

R>Мы же не штампуем целиком проекты, мы пишем отдельные функции — вот тут функци, которая форвардит вызов другой, а вот тут функция, которая вызывает ещё 3 функции, а вот тут функция, которая выделяет ресурс и т.д.


Пустые функции — это не то. Ну сколько можно, право. Даже уже занятие ebp уменьшает вычислительный потенциал на несколько процентов.

R>>>з.ы. кстати, если в функции нет объектов с нетривиальными деструкторами, то исключения выглядят значительно привлекательнее, т.к. и эпилога/пролога нет и вызовы функции дешевле.


AS>>Не вышлядят. Блин, ну сколько можно — я ж уже показал, что в этом случае используется ebp стек фрейм. Попробуй лучше исследовать, как это влияет на перфоманс вычислительной функции, а?


R>А я сколько раз показывал, что код работает на 50% быстрее и занимает на 200% меньше.


Только ты показывал это на фикции — на пустых функциях. Которые к тому же можно оптимизировать в случае возвращаемых значений.

AS>>Я к чему — пустые функции должны идти в dev\null. Использование исключений значительно влияет на кодогенерацию. Точка.


R>Так же как и возвращаемые значения. Очевидно. Осталось только понять как.


А для этого надо как минимум анализировать результирующий код — чего сделано не было совсем. Ведь так? Ведь в результате (на мой взгляд) ты получил не эффект от использования исключений, а сравнение теплого с мягким...
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[11]: [Investigation] Exceptions vs. Return Values
От: Andrew S Россия http://alchemy-lab.com
Дата: 02.04.07 12:32
Оценка: -1
AS>>Да. Сильно. А ты не подумал, что выбор минимального из результатов — это в корне неправильный подход к статистике?

M>Статистика тут ни при чем. В подобныъ замерах скорости — интерес представляет только минимальное время выполнения.


Ух ты. Т.е. в реальной жизни пользователь запускает программу и всегда попадает на минимум? Везет...

AS>>Да нет, я не настаиваю. Просто если ты хочешь называть это исследованием и чтобы его результаты имели практическую ценность и обоснованность — должен быть виден код, который приводит к таким результатам. Скажи честно, ты смотрел для каждого варианта то, что генерит компилятор на уровне ассемблера? Ты разбирался как каждый из них работает с исключениями и с возвращающими значениями и влияние этого на кодогенерацию в целом? А ведь это все нужно, чтобы не просто статистику поиметь, а сделать из нее выводы — самое ценное, что есть в исследовании. Я выводов пока (как и самого исследования) пока тут не вижу, уж извини.


M>То есть у вас есть лучшее тестирование , и вы его зажимаете и не выкладываете ?


Я где-то такое говорил?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[12]: [Investigation] Exceptions vs. Return Values
От: CreatorCray  
Дата: 02.04.07 12:52
Оценка:
Здравствуйте, remark, Вы писали:

Пояснения:

// В этой точке мы имеем максимальный приоритет потока - 31
// Надо это для того, чтоб как можно меньше постороннего кода вщемилось в наш
// Оптимальные измерения будут на многоядерных машинах - там остальной код будет
// большей частью вытеснен на другие ядра. Для одноядерки это только несколько снизит 
// кол-во потоков.
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

// Гарантируем что ОС не перебросит поток на другое ядро - таким образом можно смело юзать
// rdtsc т.к. синхронизация TSC нас парить не будет
SetProcessAffinityMask (GetCurrentProcess (),1);

// Ну, это можно было и не делать - но пусть будет на всяк случай
SetThreadAffinityMask (GetCurrentThread (),1);
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: [Investigation] Exceptions vs. Return Values
От: remark Россия http://www.1024cores.net/
Дата: 02.04.07 13:17
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Ну и где тут реальный код? С трансляцией исключений в собственнные и т.п.? Я не вижу поинта для сравенения, уж извини. Ведь проверка ошибок для этого и используется — чтобы на основе возвращаемого значения сформировать свое. В реальной ситуации с исключениями часто ровно та же задача — у нас есть набор наших исключений и нам надо "чужие" исключения привести к нашим.


R>>Ну хорошо, а ты что утверждаешь, что реальный код — это только код с трансляцией исключений?

R>>Я надеюсь, что нет. Тогда почему не начать с простого случая?
R>>Я тебя уверяю, что есть множество кода, который никакими трансляциями не занимается.

AS>А я тебя уверяю в обратном. Сравни std и com исключения. Обычно в проекте своя иерархия исключений, и они транслируются на разных уровнях вызова. Как в этом случае добиться преймущества от исключений на уровне вызова библиотечных методов\функций — вопрос интересный.


Я не говорю, что другого не бывает. Но бывает, что не транслируются. Но как мы поймём более сложный случай, если не поймём простой?


AS>>>>>Понятно. Ну, что ж, могу лишь сказать, что это по меньшей мере неверно. Надо привязывать поток к одному ядру и устанавливать приоритеты на реалтайм — тогда хоть как то можно говорить о нормальном измерении при помощи этой методики.


R>>>>Зачем привязывать к единственному ядру? Или ты боишься, что у меня часть вычислений убежало на соседний комп?


AS>>>Куда убежать??? Вероятно, про багу с рассинхронизаций rdtsc на разных ядрах ты не слышал?


R>>Нет, чтобы на одном ядре таймер сам с собой рассинхронизировался, я не слышал. А что такое бывает?


AS>А при чем тут один. Ты тестировал на одной конфигурации?


Я тестировал на двух машиных, на обоих одно ядро.



R>>>>Зачем поднимать приоритеты? Или ты думаешь, что поток с более высоким приоритетом будет выполняться быстрее?


AS>>> Круто.


R>>Вот я тоже так подумал.


AS>Да. Сильно. А ты не подумал, что выбор минимального из результатов — это в корне неправильный подход к статистике?


Я сделал это вполне намеренно. Это вполне распространённый подход при замерах времени в условиях возникновения непредвиденных задержек.


R>>Мне не жалко трудов, просто проект получился достаточно наколеночный, т.к. когда я начинал, то не собирался делать что-то особо основательное. Но если ты так настаиваешь, сейчас всё это запакую и выложу.


AS>Да нет, я не настаиваю. Просто если ты хочешь называть это исследованием и чтобы его результаты имели практическую ценность и обоснованность — должен быть виден код, который приводит к таким результатам. Скажи честно, ты смотрел для каждого варианта то, что генерит компилятор на уровне ассемблера? Ты разбирался как каждый из них работает с исключениями и с возвращающими значениями и влияние этого на кодогенерацию в целом? А ведь это все нужно, чтобы не просто статистику поиметь, а сделать из нее выводы — самое ценное, что есть в исследовании. Я выводов пока (как и самого исследования) пока тут не вижу, уж извини.


Чего-чего, а ассемблера я нагляделся за эти дни. Нагляделся на создание фреймов исключений и проверки возвращаемых значений.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.