gpt4 book ai didi

c# - 在 .NET 应用程序中处理大型数组的性能

转载 作者:太空狗 更新时间:2023-10-29 21:53:47 25 4
gpt4 key购买 nike

我不确定这是否是我遇到的一个基本问题,但我已经几天没能解决它了...

我目前正在用 C# 编写 .NET 库(使用 .NET 3.5)。除其他外,它还包括将 Int32 数组的三元组(每个几 MB)写入远程缓存(memcached 服务器)和读回这些数组的函数。问题是,即使 memcached 服务器在本地计算机上运行,​​我能想到的每个实现都需要大约 1.2 秒来写入 10MB 数据,另外需要大约 1.2 秒来读取相同数据。

但是,为了比较性能,我将写入缓存服务器替换为写入剪贴板,并注意到执行写入仍然需要 1.2 秒。我调用了测试方法(如下所示),周围是 stopwatch 开始/停止以进行基准测试。方法是:

public void writeCachedImageData(int[,] atoms, int[,] noAtoms, int[,] dark, int cameraID, int runID, int seqID)
{

Clipboard.SetData(DataFormats.Serializable, atoms);
Clipboard.SetData(DataFormats.Serializable, noAtoms);
Clipboard.SetData(DataFormats.Serializable, dark);

}

为了进行基准测试,每个数组都是 1000x1000。基本上,我的问题是:

1) 我从这个测试中得出的结论是否正确,我的瓶颈不知何故是从应用程序到任何外部的数据传输速率?和

2)如果是这样,我可以做些什么来提高从应用程序到剪贴板或最终到 memcached 服务器的数据传输速率?

最佳答案

按照上面的建议,我尝试避免任何序列化,并通过使用 BlockCopy 做到了这一点:

 public void writeCachedImageData(Int16[,] atoms, int cameraID, int runID, int seqID)
{


byte[] bytesAtoms = new byte[2 * 1000 * 1000];

Buffer.BlockCopy(atoms, 0, bytesAtoms, 0, bytesAtoms.Length);

Clipboard.SetData(DataFormats.Serializable, bytesAtoms);
Clipboard.SetData(DataFormats.Serializable, bytesAtoms);
Clipboard.SetData(DataFormats.Serializable, bytesAtoms);


}

请注意,我将数据类型更改为 Int16 - 这是因为我意识到我的应用程序不需要 int 类型的其他两个字节。这两者的结合导致了十多倍的加速!

关于c# - 在 .NET 应用程序中处理大型数组的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29654939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com