.net I';我正在寻找一些帮助来优化c#应用程序的一部分,该应用程序将数据表写入/读取到文件中

.net I';我正在寻找一些帮助来优化c#应用程序的一部分,该应用程序将数据表写入/读取到文件中,.net,optimization,serialization,datatable,c#-2.0,.net,Optimization,Serialization,Datatable,C# 2.0,任何建议都将不胜感激,我仍在学习c#,所以如果我错过了一些明显的东西,我道歉。我使用的是VS2010,应用程序使用的是NET2.0 我希望尽可能加快这两个过程。第一个过程是从服务器读取数据表,然后将其存储为缓存文件。每个缓存文件都有多个数据表。第二部分是从缓存文件中检索这些数据表,并将它们存储在数据集中 最初,该过程将数据表存储为XML文件,创建缓存文件和检索缓存文件都花费了很长时间。当运行应用程序时。这些表的大小可以从10MB到400MB不等 我对它进行了设置,以便它在本地计算机上构建和读取缓

任何建议都将不胜感激,我仍在学习c#,所以如果我错过了一些明显的东西,我道歉。我使用的是VS2010,应用程序使用的是NET2.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

我知道这是一个很大的数据,不能期望有很多,但有其他的方法吗

对于我来说,解决这类问题的第一步是开发诸如或之类的软件,这些软件在分析各个方法调用所需的时间方面非常出色。你也可以确定你的压力点,如果一个方法被调用了1000万次,那么减少几毫秒就可以节省大量资金

我还建议使用SQL来确定这些是否可以以任何方式进行优化,google上有大量关于这方面的文章


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

优化的第一条规则是测量花费的时间。这可能是一个很好的猜测,时间在序列化代码中,但没有什么比一个好的探查器会话更能确定

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

XML序列化程序对于大型文件的速度非常慢。BinaryFormatter更好,但仍然不是一个速度恶魔

协议缓冲区的速度约为BinaryFormatter的6倍,并且存储数据比BinaryFormatter紧凑得多

(关于堆栈溢出)在.NET中编写了协议缓冲区的实现

你可以用NuGet得到这个

(,但我更喜欢Marc的实现)

还有

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


(也可通过NuGet获得)

为什么要创建缓存文件,然后将其加载到数据集中?@Mike数据表是从非本地服务器提取的。缓存文件夹在本地服务器上创建,然后用于应用程序。然后,当应用程序运行时,它访问适当的文件夹,然后用文件夹中的数据表填充数据集。我喜欢ANTS,但Visual Studio的内置探查器现在非常好,也值得一提。没错,这取决于他的VS版本,我不想陷入那种混乱状态:-是的。在VS2010之前,内置的一款就没那么棒了。谢谢!我会试试蚂蚁,看看它们的味道谢谢!protobuf-net数据的使用非常简单,它很好地提高了文件的大小和序列化/反序列化的速度。