在重構一些舊代碼時,我決定做一些毫無意義的過早優(yōu)化并重新利用緩沖區(qū)而不是每次都重新分配它。令我驚訝的是,我發(fā)現(xiàn)它的速度非常慢。再生產: private static void Main(string[] args) { const int N = (int)1e4; const int size = 100 * 1024; var sw = Stopwatch.StartNew(); var buffer = new byte[size]; for (int n = 0; n < N; n++) { buffer = new byte[size]; } var reallocMs = sw.ElapsedMilliseconds; sw = Stopwatch.StartNew(); buffer = new byte[size]; for (int n = 0; n < N; n++) { for (int i = 0; i < buffer.Length; i++) { buffer[i] = 0; } } var rewriteMs = sw.ElapsedMilliseconds; Console.WriteLine($"Reallocating: {reallocMs} ms"); Console.WriteLine($"Rewriting: {rewriteMs} ms"); Console.WriteLine($"Rewrite / reallocate = {(double)rewriteMs / (double)reallocMs}"); }內置時Release,重寫每個字節(jié)比重新分配新緩沖區(qū)慢約 8 倍。在Debug它下降到幾乎慢 50 倍!這怎么可能?我預計擁有固定緩沖區(qū)會提高性能,但顯然并非如此。我在這里錯過了什么?PS:順便說一句,Array.Clear()它始終比 for 循環(huán)慢,盡管它的性能與構建配置無關。
1 回答

holdtom
TA貢獻1805條經驗 獲得超10個贊
每次寫入數組時,它都可能引發(fā)異常。因此,在循環(huán)實現(xiàn)中的每次寫入時,都會對索引進行邊界檢查。當第一次初始化已知范圍的內存時,可以優(yōu)化掉。
- 1 回答
- 0 關注
- 202 瀏覽
添加回答
舉報
0/150
提交
取消