во время работы над проектом я случайно заметил, что один и тот же метод с одним дополнительным (неиспользованным) аргументом удается запустить даже в десять раз быстрее, чем другой, с включенной оптимизацией.
type Stream () =
static member private write (x, o, a : byte[]) = (for i = 0 to 3 do a.[o + i] <- byte((x >>> 24 - i * 8) % 256)); 4
static member private format f x l = Array.zeroCreate l |> fun a -> (f(x, 0, a) |> ignore; a)
static member private format1 f x l o = Array.zeroCreate l |> fun a -> (f(x, 0, a) |> ignore; a)
static member Format (value : int) = Stream.format (fun (x: int, i, a) -> Stream.write(x, i, a)) value 4
static member Format1 (value : int) = Stream.format1 (fun (x: int, i, a) -> Stream.write(x, i, a)) value 4
При тестировании, Stream.Format1
работает намного быстрее, чем Stream.Format
, хотя единственная разница между закрытыми членами Stream.format
и Stream.format1
заключается только в аргументе o
, который, кроме того, не используется самим методом.
Как компилятор так по-разному относится к двум почти одинаковым методам?
РЕДАКТИРОВАТЬ: спасибо за объяснение и извините за невежество.