Реферирование этот код: F# Static Member Type ConstraintsF # вопрос производительности: что делает компилятор?
Почему, например,
let gL = G_of 1L
[1L..100000L] |> List.map (fun n -> factorize gL n)
значительно медленнее, чем
[1L..100000L] |> List.map (fun n -> factorize (G_of 1L) n)
Глядя на отражатель, я могу видеть, что компилятор обрабатывает каждый из них по-разному, но для меня слишком много делается для того, чтобы расшифровать существенную разницу. Наивно я предполагал, что первое будет работать лучше, чем позже, потому что gL предварительно вычисляется, тогда как G_of 1L должен быть вычислен 100 000 раз (по крайней мере, так выглядит).
[Edit]
Похоже, что это может быть ошибка с F/.NET 2.0/Release режиме # 2.0 см @ ответ gradbot и обсуждение.
Интересно. Для меня нет смысла - насколько я могу судить, генерируемый IL соответствует вашим ожиданиям - 'gL' предварительно вычисляется в первом случае, но остальная часть кода в значительной степени эквивалентна. Возможно, есть какая-то x64 или JIT-магия? Я попробовал это на 64-битном .NET 2.0 и получил аналогичные результаты (ну, первый из них был 10 и второй 7). –
Спасибо, что посмотрели, я знал, что это было любопытно на лице, но понял, что существует достаточно интересного материала, связанного со статическими ограничениями типа, что вещи не могут быть скомпилированы так, как можно было бы ожидать - интересное предложение, что это может быть связано с JIT " магия». Я получил те же номера на 32-битном .NET 2.0. –
Я предполагаю, что это связано с тем, что первая версия является закрытием, а вторая - анонимной. F # должен создать какой-то анонимный объект для закрытия. – gradbot