Могут ли компиляторы делать больше, чем строгие семантически эквивалентные оптимизации, если мы будем держать человека в курсе?
Существуют некоторые потенциальные оптимизации, которые отклоняются компиляторами напрямую, потому что они могут не быть семантически эквивалентными.
Однако, они могут тоже подойти, так почему бы не попытаться их обнаружить и предложить? Обнаружение может включать двухэтапный процесс: этап анализа во время компиляции и этап профилирования во время выполнения.
Ошибки, предупреждения и ... предложения?
Компиляторы уже делают что-то похожее с «предупреждениями» в том смысле, что они объединяются во время каждой компиляции и остаются там навсегда в списке, пока вы не обратитесь к ним для удовлетворения компиляторов. Почему бы не иметь раздел «Предложения» или «Предлагаемые оптимизации», который работает аналогичным образом и потенциально может повысить производительность вашего приложения?
Если компилятор должен был анализировать логические выражения на предмет сложности, предполагаемого времени выполнения, вероятности того, что отдельные операнды будут истинными, а не ложными и т. Д., То он мог бы создать список предложений, например, лучший порядок для операндов выражений, и представить предложения в виде списка для программиста. Затем программист может обратиться к ним по отдельности и принять решение об их игнорировании или предложить редактору кода реализовать это предложение.
Оптимизация порядка операндов логических выражений
Рассмотрим «Оптимизация короткозамкнутых логических выражений» . Поскольку порядок операндов влияет на то, какой операнд может быть «замкнут» (т. Е. Не вызываться), порядок операндов в простых булевых выражениях (т. Е. 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, благоприятствующая короткому замыканию» из более дорогого ". Если компилятор может определить приблизительные значения одного из них во время компиляции, во время выполнения или обоих, тогда он может определить, что конкретное выражение может быть неоптимальным, и он может создать предлагаемое изменение для реализации программистом. .
Какие-нибудь компиляторы делают что-нибудь подобное сегодня? Если нет, то почему?