C++ и QT4.5 - действительно ли передача являются константой int& излишество? Действительно передает ссылкой, помогает в сигналах/слотах?

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

можно назвать его из кода, или от интерпретатора, как это:

import cProfile
cProfile.run('foo()')

Еще более полезно, можно вызвать cProfile при выполнении сценария:

python -m cProfile myscript.py

Для создания этого еще легче я сделал немного пакетного файла под названием 'profile.bat':

python -m cProfile %1

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

profile euler048.py

И я получаю это:

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 :1()
 1000    0.051    0.000    0.051    0.000 euler048.py:2()
    1    0.005    0.005    0.061    0.061 euler048.py:2()
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}

РЕДАКТИРОВАНИЕ: Обновленная ссылка на хороший ресурс видео от PyCon 2013 назвала Python, Представляющий
Также через YouTube.

8
задан Extrakun 26 August 2009 в 08:27
поделиться

3 ответа

Да, это перебор и фактически приведет к более медленному коду, чем если бы вы передали int по значению. Тип int - четыре байта; ссылка (по сути, адрес памяти) также составляет четыре байта (на 32-битной машине) или восемь байтов (на 64-битной машине). Таким образом, вам может потребоваться передать функции больше информации - и, кроме того, у вас возникнут накладные расходы на разыменование этой ссылки.

Однако если вы передаете что-то большее, чем int, это больше эффективно использовать константную ссылку, потому что вы можете передать только четыре или восемь байтов вместо того, чтобы копировать весь объект.

Править Относительно Qt: Да, если слот принимает константную ссылку на объект, тогда Причина в том, чтобы сэкономить накладные расходы на копирование объекта.

19
ответ дан 5 December 2019 в 05:34
поделиться

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

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

7
ответ дан 5 December 2019 в 05:34
поделиться

Во-первых, разница между

  • void processSomething (const int & value);
  • void processSomething (int value);

: обычно ссылка на константу передается путем передачи указателя, остальное передается путем копирования. После звонка (со стороны звонящего) результат равный. Все, что вы передаете функции, не изменяется при вызове.

Внутри функции вы также не увидите никаких различий (по крайней мере, по int). В объектах вы, конечно, можете использовать только константные функции.

Что касается производительности - передача константной ссылки на int может (или не может) быть медленнее, в зависимости от компилятора и оптимизации. Компилятор может (теоретически) оптимизировать передачу константной ссылки на передачу по значению, но я не знаю, так ли это. Работа с указателями на целые числа вместо значений, конечно, медленнее.

Подробнее об этом см. When to use pointers, and when not to use them


After reading the other linked post - the compiler can not optimize it away in a multithreaded environment. At least in a MT-environment there are real differences betwenn const int& and int calls. +1 for that link.

4
ответ дан 5 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

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