0
从.NET 3.5(.NET 2.0运行时)迁移到NET 4.0后,我们可以看到在分配更大的内存块时性能下降。请查看以下测试代码。这是一个代表我们正在使用的真实世界场景的简约测试程序。任何人都可以解释一下.NET 2.0和4.0运行时间之间的巨大差异,它是多少太慢?重现步骤:.NET 2.0与.NET 4.0运行时分配性能
- 将代码导入到C#控制台应用程序中。
- 将平台目标设置为x64。
- 目标.NET 3.5并进行发布构建。
- 运行EXE(不要从IDE运行!)并在控制台中输入“test”。
- 等待结果。
- 重复使用.NET 4.0。
谢谢。
亚历
class Program {
static DateTime firstdate, lastdate;
const int CHUNKSIZE = 10 * 1024 * 1024; // 10 MB.
const int TRIALS = 10000;
static void startmeasure() {
firstdate = DateTime.Now;
}
static void stopmeasure() {
lastdate = DateTime.Now;
var duration = lastdate.Subtract(firstdate);
Console.WriteLine("Test duration:" + duration.TotalSeconds.ToString());
}
static void Main(string[] args) {
string input;
do {
input = Console.ReadLine();
switch (input) {
case "test":
handletest();
break;
}
} while (input != "exit");
}
static void handletest() {
startmeasure();
byte[] data;
for (int i = 0; i < TRIALS; i++) {
data = getdata(CHUNKSIZE);
}
stopmeasure();
}
static byte[] getdata(int size) {
return new byte[size];
}
}
如果您没有太多空白行,您的代码将会显着易于阅读。空白是有用的,但不是在*每行*之后...(我还建议你遵循适当的命名约定,即使是一次性代码 - 它可以让大家更容易阅读。) –
这是RyuJIT的一个副作用,重写了.NET 4.6中首次发布的x64抖动。旧的抖动有一个更积极的优化器,这是一个变成bug的诀窍。旧的优化器完全删除了getdata()调用,因为它的返回值从不使用。当然有很大的差异。你实际上发现perf性能问题不太可能,没有人真正写这样的代码。请考虑在真实代码上使用分析器,以便缩小其中昂贵的部分。 –