- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已将应用程序从单线程例程切换为多线程例程。
这在 JUnit 测试中工作得很好。当使用 10
线程运行时,测试需要 195
毫秒才能完成,而当仅使用一个线程运行时,应用程序需要 406
毫秒才能完成。所以显然有性能优势。
但是当在服务器上运行它时,应用程序现在比仅单线程时需要更长的时间。
基本上,我的应用程序读取 csv 文件中的一行,将其中一个值放入一组中,然后将该行打印到另一个文件中。JUnit 测试中输入文件的大小约为 35
行长,服务器上的输入文件大小约为 6 000 000
行长。
放置这些值的集合是一个同步的HashSet
,它可以包含Long
对象。
我正在使用 Java VisualVM 监视我的应用程序,但不幸的是我不知道要寻找什么。
您对如何解决这场性能危机有什么建议吗?
<小时/>P。 S.:大多数时候我的线程被标记为等待,但我不知道它们是否真的在等待,或者它们是否太快以至于 Java VisualVM 无法显示它。
<小时/>为了进一步阐明我的例程:我单线程读取文件,但是一旦读取该行,我就会将结果对象传递给 Runnable
,将其放入一个集合中并将其打印到另一个集合中文件。同时读取下一行并将其传递给其他线程。
正如我在日志文件中看到的那样,线程正在执行某些操作,而不仅仅是等待。但存在某些跳跃,即超过100
毫秒的时间段,其中什么也没有发生。
其中一个跳跃:
2011-04-08 12:27:16,580 DEBUG [Thread-10] runnables.Runner - 7070927
2011-04-08 12:27:16,580 DEBUG [Thread-10] runnables.Runner - 9058759
2011-04-08 12:27:16,580 DEBUG [Thread-10] runnables.Runner - 7030928
2011-04-08 12:27:16,580 DEBUG [Thread-10] runnables.Runner - 15301035
2011-04-08 12:27:16,684 DEBUG [Thread-10] runnables.Runner - 7700929
2011-04-08 12:27:16,684 DEBUG [Thread-10] runnables.Runner - 17116545
2011-04-08 12:27:16,685 DEBUG [Thread-10] runnables.Runner - 4933581
2011-04-08 12:27:16,685 DEBUG [Thread-10] runnables.Runner - 2861116
注意:当时没有发生GC。
<小时/>正如下面的评论所写:我正在使用线程池。我的线程正在争夺*同一个输出文件。它们都写入同步
方法。
即使我将运行池的大小减小到 1,性能仍然很糟糕。与之前的实现相比没有什么。这不是排除了 IO 依赖或线程切换等问题吗?
<小时/>我现在已经修改了我的代码,因此在 Runnable
内部几乎没有执行任何操作。没有Set
,没有书写。只有一个日志语句。但我仍然得到了那些跳跃
。 所以我排除了一些人提出的书写或Set
问题。当只运行一个线程时,我也得到了这些空闲时间。所以线程切换似乎也不是问题。
最佳答案
您的测试文件非常小,因此整个 I/O 堆栈中的任何预读层都可能完全读取它。这使得整个执行过程受 CPU 限制。线程越多,您就可以使用更多的 CPU,从而更快地完成任务。
真实的文件 OTOH 更长,因此问题变得受 IO 限制。 CPU 大部分时间都在等待读取数据。在单线程上,不存在争用,并且 IO 可能更加线性;而多线程版本更有可能生成大量光盘搜索(迄今为止,您可以在当今的硬件上执行的最慢的操作)
根据经验,如果您从磁盘或网络读取数据并且不对数据进行繁重处理,那么最好采用单线程。
关于java - 服务器上的多线程应用程序比单线程慢(与 JUnit 测试不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5594227/
此代码似乎在启用优化的广泛使用的编译器上中断,尽管它在 Visual Studio 中运行良好。 struct foo { foo(int a) { s[0] = '0'+a%10;s[1]
我想要一个图表,其中有一个单线箭头,如下所示: 1 2 3 4 5 或者像这样(其中/假设是一个箭头:)): \/ -----------------
我正在为 Java 编写自定义规则。有两个 Tree.KIND 实例(STRING_LITERAL 和 ASSIGNMENT)需要捕获。有一个特定的行,字符串文字和赋值的逻辑都会引发问题。但 Sona
Rosettacode.org 在 Ruby 中有这个出色的单行 FizzBuzz 解决方案。 1.upto(100){|n|puts'FizzBuzz '[i=n**4%-15,i+13]||n
很多时候我使用了这个命令,它在当前目录打开了一个临时的 HTTP 服务器: python3 -m http.server 现在我需要接收文件,有没有打开ftp服务器的一行命令? 我只是在寻找一个命令行
相关主题 std::unique_ptr, deleters and the Win32 API 要将 Win32 句柄用作 RAII,我可以使用以下行 std::unique_ptr::type,
我认为必须有一个单行 Guava 解决方案来将一个不可变列表转换为另一个不可变列表,但我找不到它。假设我们有以下对象: ImmutableList input = ImmutableList.of("
我有以下 Highcharts ( http://www.highcharts.com ) 散点图。请注意,轴从 -10 开始,到 10 停止,中间为 0。我希望每条 0 线的宽度或颜色都与其他线不同
我有一个项目需要将一个视频文件与另一个音频文件合并。预期的输出是一个视频文件,其中包含来自实际视频的音频和合并后的音频文件。输出视频文件的长度将与实际视频文件的大小相同。 是否有单行 FFMPEG 命
我在 python3 类中有 2 个列表: self.keys = ["a","b","c","d"] self.values = [1,2,3,4] len(self.keys) == len(se
我有一个不同长度的数组列表,我想将它们组合成一个最大维度的矩阵,并在末尾填充零。例如(伪代码): combine( [1,2,3], [4,5]) [[1,2,3],[4,5,0]] 这是我目前的解决
例如,给定 i=5 和 n=8,我想生成 [0;0;0;0;1;0; 0;0]。具体来说,我想生成向量 v 以便: v = zeros(n,1); v(i) = 1; 有没有一种(合理的)方法可以在一
我是一名优秀的程序员,十分优秀!