Здравствуйте, Mystic Artifact, Вы писали:
MA>Поковыряв JIT, я обнаружил, что число локальный переменных для GetDetect:Transform, нужно фактически вдвое больше чем тот, что был указан в IL... Их число происходит из количества стэковых операций, и не уверен что связано с локалами, так что лимит который будет работать это... скорее 1200. С лимитом в 2048 вместо 48Kb кода, получается 38Kb, а так же требуется практически в два раза меньше места на стэке. Время исполнения безусловно улучшается тоже, но ни о каких 30%-40% речи там нет. Таким образом что первая, что вторая версия обламывается с сообщением "Stopped promoting struct fields, due to too many locals.", и только JIT с умеличенным лимитом не обламывается. Но даже если он не обламывается — судя по всему это тот случай где ты много не теряешь (там остается именно каких-то 4 структуры, 1x ValueTuple`2 и 3x Vector32`1). Хрен его знает. Безусловно, более качественная компиляция помогает. Но размер кода с оптимизированными locals так же уменьшается до 43Кб, что как бы всё равно лучше.
Я, если честно, не понимаю, откуда он (дотнет) берёт такие глубины стека. Там же вполне себе прямолинейный код, два вложенных цикла. Ну, выражение там есть. Откуда там эти тысячи-то? Едва ли 20 maxstack должен быть.
MA>MA>lclMAX_TRACKED = 512
MA>| Method | WHalf | FileName | Mean | Error | StdDev | Ratio |
MA>|------------------------ |------ |----------- |---------:|--------:|--------:|------:|
MA>| UnsafeSauvolaScalar | 5 | p00743.bmp | 671.6 ms | 4.69 ms | 4.38 ms | 1.00 |
MA>| CachedLinqSauvolaVector | 5 | p00743.bmp | 638.0 ms | 7.64 ms | 7.15 ms | 0.95 |
MA>| CachedLinqSauvolaScalar | 5 | p00743.bmp | 773.9 ms | 4.66 ms | 4.36 ms | 1.15 |
MA>lclMAX_TRACKED = 2048
MA>| Method | WHalf | FileName | Mean | Error | StdDev | Ratio |
MA>|------------------------ |------ |----------- |---------:|--------:|--------:|------:|
MA>| UnsafeSauvolaScalar | 5 | p00743.bmp | 673.9 ms | 5.37 ms | 4.76 ms | 1.00 |
MA>| CachedLinqSauvolaVector | 5 | p00743.bmp | 610.2 ms | 0.77 ms | 0.72 ms | 0.91 |
MA>| CachedLinqSauvolaScalar | 5 | p00743.bmp | 732.3 ms | 4.65 ms | 4.35 ms | 1.09 |
MA>
MA> В общем как-то много мороки, а профита не виднос с ковыряниями вокруг JIT. Надоел он что-то. Там выхлоп его данных в 100Мб на этот метод. Не хочу больше читать. Ничего не понятно всё равно.
MA> Вот альтернативный замер для подумать:
MA>MA>Run 1:
MA>| Method | WHalf | FileName | Mean | Error | StdDev | Ratio | RatioSD | BranchInstructions/Op | BranchMispredictions/Op |
MA>|------------------------ |------ |----------- |-----------:|---------:|---------:|------:|--------:|----------------------:|------------------------:|
MA>| SafeSauvola | 5 | p00743.bmp | 1,256.5 ms | 5.32 ms | 4.44 ms | 1.82 | 0.01 | 783,368,081 | 3,552,007 |
MA>| UnsafeSauvolaScalar | 5 | p00743.bmp | 689.6 ms | 3.19 ms | 2.98 ms | 1.00 | 0.00 | 314,035,883 | 970,411 |
MA>| LinqSauvolaVector | 5 | p00743.bmp | 1,276.0 ms | 6.58 ms | 6.15 ms | 1.85 | 0.01 | 533,759,280 | 5,058,339 |
MA>| LinqSauvolaScalar | 5 | p00743.bmp | 1,267.0 ms | 6.60 ms | 5.51 ms | 1.84 | 0.01 | 400,418,238 | 5,938,255 |
MA>| CachedLinqSauvolaVector | 5 | p00743.bmp | 677.1 ms | 5.66 ms | 5.30 ms | 0.98 | 0.01 | 214,382,434 | 801,792 |
MA>| CachedLinqSauvolaScalar | 5 | p00743.bmp | 815.8 ms | 16.20 ms | 15.91 ms | 1.18 | 0.02 | 97,124,131 | 1,867,112 |
MA>Run 2:
MA>| Method | WHalf | FileName | Mean | Error | StdDev | Ratio | RatioSD | BranchInstructions/Op | BranchMispredictions/Op |
MA>|------------------------ |------ |----------- |-----------:|---------:|---------:|------:|--------:|----------------------:|------------------------:|
MA>| SafeSauvola | 5 | p00743.bmp | 1,256.7 ms | 2.48 ms | 2.32 ms | 1.83 | 0.01 | 803,031,495 | 3,632,242 |
MA>| UnsafeSauvolaScalar | 5 | p00743.bmp | 685.3 ms | 3.28 ms | 3.07 ms | 1.00 | 0.00 | 305,128,752 | 916,065 |
MA>| LinqSauvolaVector | 5 | p00743.bmp | 1,115.8 ms | 4.97 ms | 4.41 ms | 1.63 | 0.01 | 561,164,990 | 5,154,875 |
MA>| LinqSauvolaScalar | 5 | p00743.bmp | 1,241.6 ms | 3.64 ms | 3.41 ms | 1.81 | 0.01 | 425,470,320 | 6,090,332 |
MA>| CachedLinqSauvolaVector | 5 | p00743.bmp | 671.9 ms | 12.92 ms | 13.27 ms | 0.98 | 0.02 | 205,053,288 | 729,199 |
MA>| CachedLinqSauvolaScalar | 5 | p00743.bmp | 785.7 ms | 3.74 ms | 3.50 ms | 1.15 | 0.00 | 99,804,388 | 1,917,611 |
MA>
Всё равно не понимаю, куда он тормозит при исполнении. Я сейчас вывожу ручки для отключения оптимизаций; можно будет попробовать сгенерировать код, максимально близкий к UnsafeSauvolaScalar.