1 | |
Что такое compile-time алгоритмы и для чего они нужны?28.12.2011, 14:54. Показов 23975. Ответов 45
Метки нет (Все метки)
1
|
28.12.2011, 14:54 | |
Ответы с готовыми решениями:
45
Что такое шейдеры и для чего они нужны? Что такое беки и для чего они нужны? Что такое саттелиты и для чего они нужны? Что такое атрибуты и зачем они? Для чего нужны директивы препроцессора? |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
28.12.2011, 15:02 | 2 |
Evg, Во всем есть польза, смотря как это использовать.
Ради примера : http://www.boost.org/doc/libs/... ratio.html
0
|
28.12.2011, 15:18 | 3 |
ну ты чего?.. как же без компайл-тайм в двух случаях?:
1. алгоритмы оперирующие типами. 2. вынесение ран-тайм задач оперирующих константными данными в компайл-тайм. Добавлено через 1 минуту тут еще нужно уметь мыслить типами, а не значениями.
0
|
28.12.2011, 15:24 [ТС] | 4 |
Если честно, я не понял, что это пример демонстрирует
Давай всё-таки не путать писюн с гусиной шеей. Не надо мне рассказывать про полезность шаблонов. Я говорю лишь об алгоритмах, которые через хитроумно написанные шаблоны что-то, зависящее от констант, превращают в другие константы. Какая от этого практическая польза? Желательно с примерами
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
28.12.2011, 15:48 | 5 | ||||||||||
Evg,
http://habrahabr.ru/blogs/cpp/86651/ Где-то видео некий большой проект с огромным кол-вом использования буста, в частности mpl/fusion. Ссылку не найду. Но в продакшне mpl довольно редко используется, что есть то есть. Добавлено через 8 минут Пример использования как раз mpl-а есть в либе Arabica - С++ обертка над разными xml-парсерами, схема DOM, поддержка XSLT, Xpath.
0
|
28.12.2011, 16:02 | 6 |
в одном моем проекте распределенной сети вычислительных единиц, я использовал компайл-тайм генерацию хеш сумм имен процедур для того, чтоб эту хеш сумму использовать в mpl::map<> для получения типа сериализатора/десериализатора для каждой конкретной процедуры.
можно было это все перенести в ран-тайм, но тогда бы пришлось столкнуться с двумя проблемами: 1. снижение производительности. 2. отлов ошибок в ран-тайм. что не очень приятно. Добавлено через 4 минуты так же, некий мой товарищ, при работе с CUDA использует mpl для генерации таблиц и матриц из некоторых изначальных значений. Добавлено через 4 минуты еще, меня постоянно веселят записи в чьем-то коде типа "var = sqrt(1.7)" спрашивается, для чего постоянно считать значение, если оно неизменно?
2
|
28.12.2011, 16:13 [ТС] | 7 |
ForEveR, из всего того, что ты привёл, я не увидел того, что является compile-time алгоритмом в том смысле, в котором его понимает ТС (если я правильно его понял). "Технология, построенная на шаблонах" и "compile-time алгоритмы, построенные на шаблонах" - это как бэ две разные вещи
На сколько сотых долей процента это дело ускорило работу программы? Отлов ошибок в наношаблоных алогритмах, которые как бы чего-то считают в compile-time - ещё более сложная задача, потому что этот процесс работы компилятора ты не можешь ни оттрасировать, ни отладочными печатами пощупать Все эти алогритмы работают исключительно в случаях, когда одну константу надо перевести в другую, что на практике используется редко, потому как на практике обычно работают с заранее неизвестными величинами. А редкие случаи с константами, на мой взгляд, не дадут существенного прироста. А потому мне кажется, что вместо того, чтобы извращаться с шабонами, можно делать по простому, чтобы это вычислялось в run-time, но зато было понятно и просто. Единственный полезный случай, который с ходу лезет в голову - это вычисление инициализатора для const переменных. Очень часто хочется сделать так, чтобы записать что-то в переменную один раз и чтобы больше переменную не менять. Для автоматических переменных это всё нормально рулится квалификатором const, а вот для статических не всегда получается. При этом бывают случаи, что значение переменной в приницпе можно было бы вот через такие пляски с бубнами вычислить. Но а других полезных практических применений я с ходу не вижу. Добавлено через 50 секунд И как же это сделать через compile-time алгоритмы?
0
|
28.12.2011, 16:18 | 8 |
почитай Александреску.
Добавлено через 1 минуту соответствующим шаблоном. вот только записываться это будет как "var = sqrt<1,7>::value" Добавлено через 51 секунду на 6 процентов. Добавлено через 39 секунд но это делается один раз при написании шаблона. а не каждый раз при его использовании.
0
|
28.12.2011, 16:20 [ТС] | 9 |
А готовый пример написать можно?
На каком интервале времени? Если 6% на времени в 1 секунду, то это не показатель, если 6% на времени исполнения в 1 час, то тут речь может идти только о плохой первоначальной реализации Добавлено через 48 секунд Ой не факт... Вполне можно доизголяться до того, что при одних константах у тебя будет нормально работать, а при других будет работать ненормально. Да и run-time принормальной работе тоже делается только один раз
0
|
28.12.2011, 16:30 | 10 |
в 1 секунду.
дело в том, что каждый узел сети имеет производительность на пустых операциях - ~740 000. теперь это значение умнож на два(запрос/ответ). изначально в реализации я использовать std::map<>. затраты на получения конкретного сериализатора/десериализатора составляли 13 процентов. при замене его на std::unordered_map<> затраты составили 6 процентов. с компайл-тайм картой - 0 процентов. Добавлено через 1 минуту ну дык! шаблон значит криво закожен. (если мы все еще о нем) Добавлено через 2 минуты сходу не получится. ибо нужно продумать способ сохранения лидирующих нулей в обеих составляющих...
0
|
28.12.2011, 16:37 [ТС] | 11 | ||||||||||
Не показатель. Это всего лишь говорит о том, что в программе слишком маленькая полезная нагрузка. Т.е. условно говоря можно сравнить коды
Кстати, ты так и не написал кода с compile-time вычислением корня А чем принципиально отличается криво закоженный шаблон от криво закоженного run-time алогритма? По-моему ничем
0
|
28.12.2011, 16:39 [ТС] | 13 |
Ну вот о чём и я. Зачем извращаться и из принципа что-то делать в compile-time, когда по простому это можно сделать в run-time. Благо язык Си++ тут даёт больше возможностей, чем Си
Добавлено через 32 секунды Там нет compile-time алгоритмов Добавлено через 55 секунд Если я правильно понимаю твой термин "compile-time алгоритм"
0
|
28.12.2011, 16:39 | 14 |
читай предыдущий пост.
тем что шаблон пишется один раз, а используется множество раз. а т.к. существует проверка в компайл-тайм, то при ошибке использования ты и получишь ошибку компиляции, а не в ран-тайм.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
28.12.2011, 16:40 | 15 |
Evg, http://habrahabr.ru/blogs/cpp/124963/ на тему корня.
2
|
28.12.2011, 16:42 | 16 |
mpl::find() не алгоритм?
а std::find() тоже не алгоритм? Добавлено через 49 секунд ForEveR, спасибо за ссылку.
0
|
28.12.2011, 16:44 [ТС] | 17 |
Только при извращённо написанной системе шаблонов ты,особенно если ты не автор этого изврата, долго будешь пытаться понять, из-за чего возникла ошибка. Потому что здесь можно только прощёлкать всё это в уме и никак нельзя оттрасировать, чего можно было бы в случае compile-time'а. К тому же область того, что реализуемо через compile-time алгоритмы, она ну очень узкая, а всё это через run-time алогритмы будет выглядеть не в пример проще.
0
|
28.12.2011, 16:57 [ТС] | 19 |
Если не затруднит, из всего этого напиши ГОТОВЫЙ ТЕСТОВЫЙ ПРИМЕР, который можно скопилировать и запустить.
А они compile-time? Я просто не большой специалист в Си++, но, насколько я это понимаю, compiletime'ность относится только к типам, а не к константам, что есть "технология", а не "алгоритм". Даже если и compile-time, то опять-таки какая от них польза там, где все структуры данных динамические (т.е. появляются лишь в процессе испольнения программы). А ведь именно такими являются подавляющее большинство задач Добавлено через 5 минут На у тогда зачем делать сложным то, что можно сделать простым. Вернее зачем - это понятно. Я написал про переменные const (ну или элементы enum'а, что принципиальной разницы не имеет). Но это очень узкое место, в том плане, что многого на нём не сэкономишь. Ну а то, что практической пользы нет - я это я погорячился. Польза, конечно, есть, но, на мой взгляд, очень не большая и в очень редких случаях оно действительно обосновано
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
28.12.2011, 17:01 | 20 | |||||
Evg,
1
|
28.12.2011, 17:01 | |
28.12.2011, 17:01 | |
Помогаю со студенческими работами здесь
20
Что за драйвера такие, для чего они и нужны ли они вообще? Что такое векторы, и для чего нужны? Что такое Ant и Struts, и для чего нужны? Compile - time алгоритмы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |