C: производительность присвоений, бинарные операции, и так далее

Я услышал много вещей о производительности в C; кастинг является медленным по сравнению с нормальными присвоениями, функциональный вызов является медленным, бинарная операция намного быстрее, чем нормальное функционирование, и так далее...

Я уверен, что некоторые из тех вещей характерны для архитектуры, и компиляторная оптимизация могла бы иметь огромное значение, но я хотел бы видеть диаграмму для получения общего представления, что я должен сделать и что я должен постараться не писать высокоэффективным программам. Есть ли такая диаграмма (или веб-сайт, книга, что-нибудь)?

5
задан Suugaku 22 May 2010 в 21:39
поделиться

6 ответов

В основном нет. На уровне синтаксиса нет такой книги "подсказок и уловок", потому что нет надежной гарантии, что все, что вы заявили, верно (на самом деле, большая часть из них ложна).

В целом, при настройке производительности следует уделять больше внимания алгоритмам, за которыми следует оптимизация расположения памяти и кеша. Лучшие инструменты, которые у вас будут, - это профилировщики (oprofile, valgrind, cachegrind и т. оптимальные задачи внутреннего цикла).

Если вас интересуют микрооптимизации архитектуры Intel (и всех процессоров, совместимых с Intel), обязательно прочтите этот (PDF). На сайте Агнера есть более интересные руководства.

10
ответ дан 18 December 2019 в 06:34
поделиться

Давным-давно была книга под названием Эффективный C . Несколько позже вышла книга Эффективное программирование на C / C ++: меньше, быстрее, лучше . Еще совсем недавно был один под названием Efficient C ++ .

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

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

2
ответ дан 18 December 2019 в 06:34
поделиться

Я много слышал о производительности в C ...

Кто-то дал вам несколько очень странных идей. Мне особенно нравится различие между «двоичными» и «обычными» операциями. Я думал, что для компьютера двоичный код был нормальным. Кто-то должен будет объяснить мне это различие.

Я хотел бы увидеть диаграмму, чтобы получить общее представление о том, что мне следует делать и чего следует избегать при написании высокопроизводительных программ.

Я предоставляю вам диаграмму ниже. Предполагается, что вы узнали о языке C на уровне Кернигана и Ричи, который является классическим учебником по C и единственной книгой по C, которая вам когда-либо понадобится (хотя другие полезны).

    Have you read Jon Bentley's book "Programming Pearls"?  --no--> read it
             |
             | yes
             V
    Have you read Peter van der Linden's book 
    "Expert C Programming: Deep C Secrets"?                 --no--> read it
             |
             | yes
             V
    Have you learned how to use valgrind --tool=callgrind
    and the kcachegrind visualizer?                         --no--> learn them
             |
             | yes
             V
    Congratulations!  You are now equipped to write 
    reasonably efficient C programs.

Большинство тем в книге Бентли, особенно алгоритмы, заслуживают более глубокого изучения в другом месте. Но этот график будет безболезненным и интересным способом начать работу .

1
ответ дан 18 December 2019 в 06:34
поделиться

Где вы слышите эти вещи ?? Из всех мифов, которые «становятся вирусными» в этой области, это, пожалуй, самый удивительный, который я слышал.

C максимально приближен к машинному языку и при этом остается машинно-независимым языком "высокого уровня".

Все остальные ответы верны.

Я бы только добавил, что в реальном программном обеспечении (а не в маленьких двухстраничных программах) излишняя универсальность, чрезмерная абстракция, убийство мух базуками являются непреодолимой причиной низкой производительности, даже если каждый последний программист считает свое решение " просто".

1
ответ дан 18 December 2019 в 06:34
поделиться

Мне кажется, вас все это очень смущает. Давайте рассмотрим некоторые из этих мифов, которые вы придумывали.

Кастинг медленный по сравнению с обычными заданиями.

Это действительно зависит от того, что вы снимаете. Между разными типами адресов нет; приведение здесь фактически бесплатно , поскольку вы просто применяете другую интерпретацию к одному и тому же значению. Приведение числового типа к разной ширине может быть немного медленнее (и иногда выполняется неявно при присваивании), но все же очень быстро.

Вызов функций выполняется медленно.

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

Бинарные операции выполняются быстрее, чем обычные операции.

Что такое «нормальная работа»? FWIW, сложение - это бинарная операция. Так умножение. На современном оборудовании они оба довольно быстрые. Пусть об этом позаботится компилятор.Гораздо важнее сосредоточиться на описании того, что вы делаете правильно.

Теперь о вещах, которые действительно стоили :

  • I / O.
  • Распределение памяти.
  • Копии из памяти.
  • Глубоко вложенные (или очень длинные) петли.

Не спускайте с них глаз; там программное обеспечение обычно замедляется. И всегда выбирайте хорошие алгоритмы и структуры данных.

9
ответ дан 18 December 2019 в 06:34
поделиться

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

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

1
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: