提高长时间操作的性能

3
我有一个文件加密程序。当该程序加密文件时,CPU使用率不超过25%,因此速度很慢。
如何使操作系统分配更多的CPU负载给它?(例如WinRAR在压缩文件时,可以达到100%的CPU负载)
[编辑]:由于我的处理器核心数是4,因此它不会使用超过一个核心。如何让它使用其余的核心?

2
如果它没有使用所有的CPU,那么它就是I/O绑定,也就是说,它花费时间在打开/保存文件上。编辑:或者没有使用所有的CPU核心。您可以通过并行进行多个加密和在加密时加载文件来提高性能。 - George Duckett
2
25%是一个可疑的CPU数字;你有四核心的机器吗? - dlev
我每次只加密一个文件,FileStream的IO会减慢这个过程吗?我的CPU是英特尔i5。 - user586399
由于我正在使用C#的流进行IO操作,因此它与C#密切相关。 - user586399
@Mr.DDD:你试过使用PFX吗?这里有一个例子。看看我的回答。 - KMån
5个回答

2

除非您在限制应用程序,否则它将使用操作系统允许的最大CPU - 默认情况下应该高达100%。我猜测某些其他资源是瓶颈。

您是否从远程位置流式传输要加密的数据?从某个因某种原因而非常慢的磁盘?


你的意思是我应该先将文件加载到RAM中以获得速度吗?但是有一个问题,一些文件对于RAM来说太大了(几个GB)。 - user586399
1
缓冲对于提高访问远程资源的性能非常有益。但仅靠它本身可能不会带来太多与CPU使用相关的性能优势。在阅读了这里其他答案后,我倾向于认为单线程应用程序并没有从您的多核CPU中受益。您可以尝试在新线程上运行缓冲操作,并在另一个线程中进行加密... - Yuck
我想学习更多关于线程的知识。有什么好的资源吗? - user586399

1
如果您的工具是单线程程序,那么它只会占用一个核心!如果您的程序只执行for循环或其他类型的循环,则性能将在该核心上达到100%。如果该工具必须进行I/O操作,则它永远无法达到最大性能。而您看到的25%是所有CPU核心的总和。据我记得,有一些帖子向您展示如何在每个CPU核心上显示消耗百分比!

那么问题的解决方案是将工具分成多个线程吗? - user586399
@Mr.DDD,这意味着它在多核系统上使用更多的CPU,但也有可能受到I/O限制。 - George Duckett

1
有时人们认为高CPU使用率意味着程序效率高。 如果是这样的话,无限循环将是最有效的。
当你有一个基本上从机械硬盘处理文件的程序时,理想情况下它应该是IO绑定的,因为读取文件只需要完成。 即CPU部分应该足够高效,以便与从磁盘移动文件相比,它所占用的时间百分比较低。 任何可以减少CPU时间的操作都将减少CPU百分比,因为I/O占总时间的比例更大,反之亦然。 如果你可以在两者之间来回切换,先减少CPU(程序调优),然后减少I/O(例如固态硬盘),你可以让它真正飞起来。
然后,如果CPU部分仍然比你想要的时间长,那么请务必将其分配到多个核心上。

1

以防萬一,如果您正在使用v4.0而非分配更多CPU負載,請嘗試使用Parallel Framework(PFX)它已經針對多核處理器進行了優化{{link2:}}。

Parallel.Invoke(() => DoCompress());

同時,C#中的線程是宇宙中最好的線程相關資源。


-1

这与处理器和分配资源无关:您使用的工具只是没有设计为使用(我猜)cpu的所有4个核心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接