2017-01-31 2 views
0

Этот вопрос чисто из любопытства, и я уверен, что ответ зависит от компилятора. Это также экстремальная микро-оптимизация, которая почти наверняка приведет к недостижимому коду. Процессор, очевидно, должен выполнять каждый расчет и хранить его где-то, поэтому, возможно, это функционально одинаково.Бывают ли операторы одной строки?

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

Например, этот код:

var result = GetNumber(); 
var adjusted1 = result + 10; 
var adjusted2 = adjusted1/2; 
var final = GetFinal(adjusted2); 

могут быть преобразованы в следующем:

var final = GetFinal((GetNumber() + 10)/2); 

В общем будет выходной составитель что-то вроде этого, одна строка без каких-либо переменных, всегда быть одинаковыми на разных языках? Если бы вышеупомянутое утверждение включало 100 вычислений, было бы то же самое?

+0

Вы можете [проверить код сборки] (http://stackoverflow.com/a/137074/2721883) для обоих. – clcto

+0

Это правда. Однако мне интересно больше в общем случае. – Telavian

+1

Ответ отсутствует. Например, на языках с чистыми функциями и ленивом eval однолинейный аргумент 'GetFinal' может даже не оцениваться, если он не используется, в то время как для четырехстрочной версии. Это даже до рассмотрения компиляции (или языков, где + не означает арифметику плюс). После компиляции каждый компилятор может иметь свою реализацию до тех пор, пока он соответствует, и такие оптимизации не применяются. В общем, сделайте макро-оптимизацию и позвольте микро-оптимизации компилятору, сосредоточьтесь на удобочитаемости, когда сомневаетесь. –

ответ

2

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

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

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

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

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

+0

Церебральные усилия важны наверняка! :) – Telavian

1

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

Смежные вопросы