gpt4 book ai didi

c# - 在 C/C++ 中重写 C# 代码的性能提升

转载 作者:IT老高 更新时间:2023-10-28 22:10:13 55 4
gpt4 key购买 nike

我编写了一个程序的一部分,该程序在 C# 中对字符串进行了一些繁重的工作。我最初选择 C# 不仅是因为它更容易使用 .NET 的数据结构,还因为我需要使用这个程序来分析数据库中大约 2-3 百万条文本记录,并且使用 C# 连接数据库更容易.

程序的一部分拖慢了整个代码的速度,我决定用 C 语言重写它,使用指针访问字符串中的每个字符,现在这部分代码花了大约 119 秒来分析C# 中的 10,000,000 个字符串只需 5 秒即可完成 C 代码!性能是重中之重,所以我正在考虑用 C 重写整个程序,将其编译成 dll(我开始编写程序时不知道该怎么做)并使用 C# 中的 DllImport 来使用它的方法来工作与数据库字符串。

考虑到重写整个程序需要一些时间,并且由于使用 DllImport 处理 C# 的字符串需要编码和诸如此类的事情,我的问题是 C dll 更快的字符串处理带来的性能提升是否超过了不得不反复编码字符串以从 C# 访问 C dll?

最佳答案

首先,分析您的代码。您可能会发现一些真正的头巾可以大大加快 C# 代码的速度。

其次,使用指针在 C 中编写代码并不是一个公平的比较。如果您要使用指针,为什么不用汇编语言编写它并获得真正的性能呢? (不是真的,只是reductio ad absurdam。)对于 native 代码更好的比较是使用std::string。这样,您仍然可以从 string 类和 C++ 异常安全中获得很多帮助。

鉴于您必须从数据库中读取 2-3 百万条记录才能完成这项工作,我非常怀疑破解字符串所花费的时间会超过加载所花费的经过时间来自数据库的数据。因此,请考虑如何构建代码,以便在数据库加载过程中开始字符串处理。

如果你使用 SqlDataReader (比如说)顺序加载行,应该可以尽可能快地批量处理 N 行并移交给单独的线程进行后处理是你目前的头疼和这个问题的原因。如果您使用的是 .Net 4.0,使用 Task Parallel Library 最简单。 , 和 System.Collections.Concurrent也可用于线程之间的结果整理。

这种方法应该意味着数据库延迟和字符串处理都不是停止显示的瓶颈,因为它们是并行发生的。这适用即使您在单处理器机器上,因为您的应用可以在等待下一批数据通过网络从数据库返回时处理字符串。如果您发现字符串处理最慢,请为此使用更多线程(即Tasks)。如果数据库是瓶颈,那么您必须寻找外部手段来提高其性能——数据库硬件或架构、网络基础设施。如果您在处理更多数据之前需要一些结果,TPL 允许在 Tasks 和协调线程之间创建依赖关系。

我的观点是,我怀疑用原生 C 或其他语言重新设计整个应用程序是否值得。有很多方法可以给这只猫剥皮。

关于c# - 在 C/C++ 中重写 C# 代码的性能提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4203724/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com