1

我目前正在开发一个用 C++ 和 C# 编写的(遗留)程序;它执行一些重量级计算,但应该是完全确定的。即相同的输入将产生相同的输出......问题是2次运行(在同一台计算机上,使用相同的编译可执行文件)产生略有不同的输出。

应用程序读取和写入 SQL Server 数据库(它对 DB 具有唯一的访问权限,因此不应有其他任何东西干扰 DB 值)。

运行之间唯一明显的区别是它们每个都被分配了一个唯一的名称(只是一个字符串变量)。

代码中没有随机对象,所有循环都运行预定次数的迭代或直到满足条件,它们不会运行一定的时间。有少量的多线程,我确信它是线程安全的,但我会自己检查一下。

我应该寻找其他明显的东西,这会导致这种异常行为吗?

4

4 回答 4

2

如果是 C++,那么另一件事就是内存分配。一个值可能没有在某处初始化,因此取当时内存中的任何值。

于 2011-04-21T16:39:36.993 回答
2

我想到了两个想法:

  • 未初始化的变量。
  • 浮点运算不是关联的。

后一点会在多线程下产生机器精度水平差异。不过,它更有可能是未初始化的变量!

于 2011-04-21T16:52:34.573 回答
1

一些可能的原因浮现在脑海中:

  • 浮点数学在 32 位版本上可能会给出稍微不同的结果。64 位
  • 一些迭代算法可能会使用某种随机性来初始化一些起始向量左右
  • 某些实现可能使用 3rd 方库 - 预装在系统上。LAPACK 或 FFTW 是一些候选者。他们可能有不同的版本,也可能导致这种情况。
于 2011-04-21T16:48:16.430 回答
0

确定性是根据定义的输入设置的。

重新运行之间是否重置了数据库?也许数据库的备份和恢复是有序的,您的后续测试应该从数据库的新恢复中执行。如果可行,那么您需要返回设计文档以确定是否允许根据数据库输入进行不同的输出。

如果设计文档不允许根据数据库输入的不同输出,那么您的程序不是按照规范构建的。

如果您的程序使用与输入相同的数据库产生不同的输出,那么它可能正在某处读取时间(可能存储时间戳),在这种情况下,它根本不能被认为是 100% 确定性的。

无论哪种方式,您对算法的输入可能比您跟踪的要多,因此存在不确定性。

于 2011-04-21T16:40:26.377 回答