【发布时间】:2012-05-26 15:02:10
【问题描述】:
我知道我不应该优化程序的每一个点,让我们假设我必须优化数组初始化。
所以我编写了比较 for loop 和 Array.Clear 的程序
using System;
using System.Diagnostics;
namespace TestArraysClear
{
class Program
{
static void Main(string[] args)
{
int[] a = new int[100000];
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 10; i++)
{
sw.Reset();
sw.Start();
for (int j = 0; j < a.Length; j++)
{
a[j] = 0;
}
sw.Stop();
Console.WriteLine("for " + sw.ElapsedTicks);
sw.Reset();
sw.Start();
Array.Clear(a, 0, a.Length);
sw.Stop();
Console.WriteLine("Array.Clear " + sw.ElapsedTicks);
}
}
}
}
我的机器上的输出:
for 1166
Array.Clear 80
for 1136
Array.Clear 91
for 1350
Array.Clear 71
for 1028
Array.Clear 72
for 962
Array.Clear 54
for 1185
Array.Clear 46
for 962
Array.Clear 55
for 1091
Array.Clear 55
for 988
Array.Clear 54
for 1046
Array.Clear 55
所以Array.Clear 比for loop 快大约 20 倍。但是Array.Clear 初始化为0。我可以以某种方式以相同的性能将数组初始化为-1 吗?
upd: 我不是在寻找一些“极度不安全”的代码。我正在寻找像Array.Clear 这样简单的东西。我只是想知道 .NET 提供快速 0 初始化,但 .NET 不提供对其他值的初始化。那么为什么 .NET 更喜欢“0”而不是“-1”呢?
upd 我想重置现有的数组。所以我正在寻找Array.Clear 的模拟,它将数组重置为-1,而不是0
【问题讨论】:
-
你不应该用这么少的测试这么快就得出这样的结论。您应该使用更大的数组(远远超过 1000 个,但您现在很好)和更多的迭代(指数大于 10)并将它们平均化。
-
我想知道您在做什么,将数组设置为相同的值(O(n) 操作)实际上需要大量时间。你真正想做什么?
-
@JeffMercado 更新代码,固定数组大小,增加到
100000 -
@javapowered:这很好,一个不错的整数。但是您需要 更多 次重复此测试才能获得良好的基准。 10 是不够的。
-
@MikeBantegui 交易。在大多数应用程序中,您花费 500 µs 还是 495 µs 并不重要。在交易中,如果您花费 495 µs,您可能会赚钱,如果您花费 500 µs,您可能会亏钱。
标签: c#