Legacy-C C ++合并

时间:2009-10-03 09:06:56

标签: c++ multithreading legacy-code

我目前正致力于一个包含性能的关键应用程序 遗留c代码(SPICE变体)。

问题如下:

遗留c代码的创建者显然相信使用 论证传递是现代时代的重大祸害之一。因此大约90% 所有变量都在全球范围内宣布。

为了模拟的目的,必须重复调用遗留代码,并且使用线程对此代码段进行并发调用将是有利于整个执行时间的。

我的想法是封装遗留的c代码(我已经稍微修改了g ++编译),这样就可以创建遗留代码的多个对象,从而消除了许多互斥锁的必要性。显然,全局变量将被封装为成员变量。

这给桌子带来了另一个问题。遗留编码器也不相信全局变量的初始化;可能因为C倾向于将全局变量初始化为0。 虽然C ++成员变量没有接缝以获得相同的处理。为了正确运行传统c代码,必须将一些变量初始化为0。但由于使用了大量的全局变量,发现这些变量已经证明非常困难。

请注意,时间不允许我将旧版c代码修改为任何专业版 度。

我的问题如下:

  1. 我认为C代码的封装速度会更快 比使用大约90个互斥锁?

  2. 是否有一种简单的方法可以找到未初始化的成员变量? (据我所知,gcc只能为自动变量执行此操作)。这样我才能初始化关键变量?

  3. 如果不是问题2 ...是否有一种快速而简洁的方法来初始化所有成员变量而不使用普通的构造函数init方法?

  4. 或者(一个长镜头)是否有一种快速的方式来跟踪程序流程,以便我可以合并自己的参数?

  5. 任何帮助都将受到极大的赞赏。 N.B。

3 个答案:

答案 0 :(得分:3)

  1. 是。如果你可以将状态放入你传递指针的对象中,那么它将比锁定更快,假设你实际上使用了线程。
  2. 不,找出单元化成员变量并不容易。从本质上讲,这将需要执行整个代码分析,这通常是不能做的(由于库的存在)
  3. 如果将所有数据放在旧式结构中(即没有方法,没有访问声明),则允许memset()整个结构为零。这将导致初始化的方式与全局变量初始化相同(C确保初始化 - 为零)。
  4. 如果,快速,你的意思是“自动”,那么答案可能是“不”。

答案 1 :(得分:1)

您将使用多个线程,您需要消除或锁定线程之间共享的数据。制作旧的,非线程安全的代码可重入将意味着大量的工作和大量的调试。如果您没有太多时间深入研究遗留代码,我不会尝试。你正在打开一大堆蠕虫。

  • 您可以使用-fno-common确保g ++中全局变量的初始值为0。请参阅gcc手册。

  • 我认为你更好地追求使用多个进程而不是多个线程的建议。每个进程都有自己的地址空间,您不必触及遗留代码中的任何内容。我会很难找到一种方法来在流程级别找到解决问题的方法。 (例如,不要为每次通话都这样做,对于逻辑上独立的问题块做大做法:一次批量1000个电路。)

  • 在优化之前,首先要非常努力地了解它为什么会变慢。使现有的串行代码并行是非常困难的工作,可能有限的回报。你确定那是你想做的。

此致 马特

答案 2 :(得分:0)

你有没有想过只使用叉而不是制作一个oo-spice?它似乎只需要对代码进行很少的更改,除非您尝试对非常小的模型进行大量分析,否则在性能方面可能不会太昂贵。