Пишу какой-то математический код на C#, заставляю его компилировать для x86 в релизе, оптимизирую, и смотрю на дизассемблирование в windbg. Обычно это довольно хорошо, часто я пишу на ассемблере лучше, чем мог бы я (не то чтобы я так хорошо разбирался в ассемблере, но вот).
Однако я заметил, что эта функция:
static void TemporaryWork()
{
double x = 4;
double y = 3;
double z = Math.Atan2(x, y);
}
Производит эту разборку:
001f0078 55 push ebp
001f0079 8bec mov ebp,esp
001f007b dd05a0001f00 fld qword ptr ds:[1F00A0h]
001f0081 83ec08 sub esp,8
001f0084 dd1c24 fstp qword ptr [esp]
001f0087 dd05a8001f00 fld qword ptr ds:[1F00A8h]
001f008d 83ec08 sub esp,8
001f0090 dd1c24 fstp qword ptr [esp]
001f0093 e86e9ba66f call clr!GetHashFromBlob+0x94e09 (6fc59c06) (System.Math.Atan2(Double, Double), mdToken: 06000de7)
001f0098 ddd8 fstp st(0)
001f009a 5d pop ebp
001f009b c3 ret
Даже если вы не гуру x86, вы заметите там кое-что странное: вызов System.Math.Atan2. Как при вызове функции.
Но на самом деле для этого есть код операции x86: FPATAN.
Почему JITer вызывает функцию, когда для выполнения операции есть реальная инструкция по сборке? Я думал, что System.Math по сути является оболочкой для нативных ассемблерных инструкций. Большинство операций там имеют опкоды прямой сборки. Но это, видимо, не так?
Есть ли у кого-нибудь информация о том, почему JITer не может/не может выполнить эту довольно очевидную оптимизацию?
bug in fpatan
я получу некоторые результаты для некоторых моделей процессоров, так что это может бытьMath.Atan2
, работающим над этими ошибками, и заменившим его вMath.Atan
. Я не совсем уверен, но, возможно, это может быть направление поиска? Хороший вопрос. - person Silvermind   schedule 21.04.2013atan2
для нескольких платформ, вызов инструкции FPATAN был бы очевидной пессимизацией. FPATAN намного медленнее, чем хорошая программная реализация, даже с учетом накладных расходов на вызовы функций. (150-300 циклов против 50-100 циклов, в зависимости от конкретной библиотеки и оборудования). - person Stephen Canon   schedule 22.04.2013