0

任何建议将不胜感激,我仍在学习 c#,所以如果我错过了一些明显的东西,我深表歉意。我正在使用 VS2010,应用程序使用 net 2.0

我希望尽可能加快这两个过程。第一个过程是从服务器读取数据表,然后将它们存储为缓存文件。每个缓存文件都有多个数据表。第二部分是从缓存文件中检索这些数据表并将它们存储在数据集中。

最初,该过程将数据表存储为 XML 文件,而这需要很长时间才能创建缓存文件和检索它们。运行应用程序时。这些表的大小可以从 10MB 到 400MB 不等。

我对其进行了设置,以便它在我的本地机器上构建和读取缓存文件。

我尝试使用二进制序列化,这很有帮助。它将表格缩小到 XML 文件大小的 1/6 左右,并且还加快了速度,但我希望看看是否有更快的东西。我一直在寻找一段时间,但我找不到其他任何东西。我检查了 protobuf-net,这看起来是一种加快序列化速度的绝妙方法,但从我发现数据表的情况来看,它似乎不能很好地使用它。

这里有一些数字..

Time to build Cache files:
XML-about 2 hours, 
Binary -  about 1 hour

Test Case for reading from Cache file:
XML - 3m 40s, 
Binary - 2m 20s

我知道这是很多数据,不能指望很多,但是还有其他方法吗?

4

2 回答 2

1

优化的第一条规则是衡量时间花在哪里。时间在序列化代码中可能是一个很好的猜测,但没有什么比一个好的分析器会话可以确定的了......

话虽如此,您在更改序列化机制时看到的性能提升确实表明至少有一部分时间花在了序列化本身上。

XML 序列化器对于大文件来说非常慢。BinaryFormatter 更好,但仍不完全是速度恶魔。

协议缓冲区比 BinaryFormatter 快 6 倍左右,并且存储数据更紧凑。

http://theburningmonk.com/2011/08/performance-test-binaryformatter-vs-protobuf-net/

在此处输入图像描述

Marc Gravell(来自 Stack Overflow)在 .NET 中编写了协议缓冲区的实现

http://code.google.com/p/protobuf-net/

您可以使用 NuGet 获取此信息。

Jon Skeet 也做了,但我更喜欢 Marc 的实现)。

还有

用于将 ADO.NET 数据表和数据读取器序列化为高效、可移植的二进制格式的库。使用 Marc Gravell 的 Google Protocol Buffers 库 protobuf-net。

https://nuget.org/packages/protobuf-net-data/2.0.5.480

(也可以通过 NuGet 获得)

于 2012-07-25T16:57:50.250 回答
0

对我来说,解决此类问题的第一步是破解dotTraceANTS之类的软件,这些软件非常擅长分析直到单个方法调用所需的时间。你也可以识别你的压力点,如果一个方法被调用 1000 万次,那么减少几毫秒就可以节省大量资金。

我还建议查看SQL 中的执行计划,以确定是否可以以任何方式对其进行优化,并且谷歌上有大量文章。

另一种选择是使用C# 秒表,用它包装代码块可能有助于识别瓶颈。

于 2012-07-25T16:57:05.533 回答