Должен ли я избежать повторного доступа к одному и тому же методу в цикле? - PullRequest
0 голосов
/ 21 мая 2018

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

В приведенном ниже коде, например, этовернет одно и то же значение метода getPosition для 10000 раз:

vector <int> arr;
for (int i=0; i<10000 ; i++)
    arr.push_back(i + window.getPosition().x)

В этом конкретном случае я знаю, что window.getPosition().x всегда будет возвращать одно и то же значение .

Чтобы избежать потери производительности, я должен изменить код, например:

vector <int> arr;
int x = window.getPosition().x;
for (int i=0; i<10000 ; i++)
    arr.push_back(i + x);

Это всегда связано с дополнительной заботой программиста.

Или есть какой-то интеллектуальный кеш, гдея не должен волноваться об этом?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Может быть;это будет зависеть от того, насколько видимый код, который вы вызываете, является компилятором (LTO или нет? Все видимые или отдельные объектные файлы?). Если компилятор может доказать, что он не может измениться, компилятор кеширует его для вас.Но, казалось бы, безобидные вещи могут помешать компилятору понять, что он не может измениться.

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

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

0 голосов
/ 21 мая 2018

Это определенно хорошая идея.Даже если стоимость вызова метода очень мала, хранение одного int стоит всего несколько байтов и почти наверняка будет быстрее.Вы также можете объявить его как const, чтобы сделать его назначение более ясным.

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

...