Могут ли компиляторы делать больше, чем строгие семантически эквивалентные оптимизации, если держать человека в курсе?
Есть некоторые потенциальные оптимизации, которые полностью игнорируются компиляторами, потому что они могут не быть семантически эквивалентными.
Однако с ними могут тоже все в порядке, так почему бы не попытаться обнаружить и предложить их? Обнаружение может включать двухэтапный процесс: этап анализа во время компиляции и этап профилирования во время выполнения.
Ошибки, предупреждения и ... предложения?
Компиляторы уже делают нечто подобное с «предупреждениями» в том смысле, что они объединяются в пул во время каждой компиляции и навсегда остаются в списке, пока вы не направите их к удовлетворению компилятора. Почему бы не иметь раздел «Предложения» или «Предлагаемые оптимизации», который функционирует аналогичным образом и потенциально может улучшить производительность вашего приложения?
Если компилятор должен был анализировать логические выражения на предмет сложности, предполагаемого времени выполнения, вероятности того, что отдельные операнды являются истинными или ложными и т. Д., То он мог бы создать список предложений, таких как лучший порядок для операндов выражений, и представить предложения. как список для программиста. Затем программист может обратиться к ним индивидуально и решить проигнорировать их или попросить редактор кода реализовать предложение.
Оптимизация порядка операндов логического выражения
Рассмотрим «Оптимизацию короткозамкнутых логических выражений». Поскольку порядок операндов влияет на то, какой операнд может быть «замкнут» (т.е. не вызван), порядок операндов в простых логических выражениях (например, A && B && C) - это то, что (я думаю) не затрагивается компилятором. чтобы избежать появления неизвестных побочных эффектов, если какой-либо операнд имеет побочные эффекты.
Учти это:
char c = reader.ReadChar(); //Stream bs; const string NEWLINE;
while (!IsStringPresent( c, bs, NEWLINE ) && c != ',')
Поскольку сравнение символа (быстрее / менее сложно), он должен стоять первым в выражении, чтобы логика короткого замыкания могла избежать вызова IsStringPresent при обнаружении запятой. Также верно, что в этом случае запятые (много на строку) будут встречаться чаще, чем последовательности новых строк.
char c = reader.ReadChar(); //Stream bs; const string NEWLINE;
if (c != ',' && !IsStringPresent( c, bs, NEWLINE )) //faster for short-circuit; plus ',' is encountered more often than newline
Резюме
Объективно, оптимальный порядок операндов может быть определен для любого выражения «A && B» на основе «Частота, когда A ложно по сравнению с B для запуска короткого замыкания» и «Стоимость вычислений A по сравнению с B, в пользу короткого замыкания большего количества дорогая ". Если компилятор мог определить приблизительные значения любого из них, во время компиляции, времени выполнения или обоих, то он мог бы определить, что конкретное выражение может быть неоптимальным, и он мог бы создать предлагаемое изменение для реализации программистом. .
Какие-нибудь компиляторы сегодня делают что-нибудь подобное? Если нет, то почему?