实现预先计算数据的最佳方法是什么?

时间:2009-03-05 19:38:27

标签: c#

我有一个计算,根据某些输入计算结果百分比。但这些计算可能需要相当长的时间,这可能很烦人。由于大约有12500个可能的输入,我认为预先计算所有数据是个好主意,并在正常的程序执行期间查看它。

我的第一个想法是创建一个简单的文件,在程序初始化时读取并填充一些数组。虽然这会起作用,但我想知道是否还有其他选择?例如,在编译期间填充数组。

顺便说一句,我正在用C#编写代码。

6 个答案:

答案 0 :(得分:2)

This tutorial here实现了一个序列化程序,您可以使用它轻松地将对象转换为二进制文件并返回。一旦掌握了序列化程序,就可以创建一个包含所有数据并对其进行序列化的对象;当你实际运行程序时,只需反序列化对象并使用它。

这具有将对象保存到硬盘驱动器的所有好处,其实现与对象无关(意味着您不必为要序列化的任何对象编写大量代码)和二进制输出(因此节省空间,如果这是一个问题)。

答案 1 :(得分:1)

包含数据的文件可能是最简单,最灵活的实现方式。

如果你想在内存中而不必从某个地方读取它,我会编写一个程序来输出你想要复制和粘贴到数组/集合初始化程序的C#类似CSV格式的数据,从而生成源代码用于预先计算的数据。

答案 2 :(得分:1)

创建一个程序,输出有效的C#代码,用于初始化查找表。制作构建过程的这一部分,以便它自动创建源文件,然后构建项目的其余部分。

答案 3 :(得分:1)

我总是首先考虑是否有任何方法可以避免预先计算。如果有12500个可能的输入,每个用户请求需要多少个?是否会同时需要所有12500,还是会及时散布?如果您可以一次计算几个,我会使用延迟初始化。我更喜欢这个解决方案,因为从长远来看,我的问题会更少。当持久格式更改或数据更改时,您会怎么做。当文件丢失或损坏时,您将如何处理它?持久保存到文件不会创建 less 代码。

如果我必须保留预先加载的版本,我将这样的文件序列化为人类可读的格式。我可能会使用xml serialization,因为它很简单。但通常会出现失效和重新计算的问题。值永远不会更改或只是很少发生?

答案 4 :(得分:1)

Daniel Lew说,将其序列化为二进制文件 如果你需要速度,请去词典。字典在其密钥上编入索引,即使有大量数据也应允许快速查找。

答案 5 :(得分:1)

我同意mquander和Trent。使用您喜欢的语言或脚本生成您需要定义数据的整个C#文件(没有复制粘贴,这是一个手动步骤,容易出错)。将其添加为Visual Studio中的Pre-Build事件。你甚至可以检测到你有一个最新的文件,并避免重建大多数版本。

有一种方法可以使用C ++中的模板元编程静态生成几乎所有数据,尽管它可能很痛苦。除非您在程序的多个部分中需要多组不同的数据,否则它是不值得的。我对C#中的元编程不够熟悉,无法评估您案例中的一般工作。你应该研究一下。