- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有处理大图像的功能。根据规范,该图像最大可以为55mb。该处理需要将图像分为几个不同的波段,然后通过将这些波段重新添加到输出图像中来重构图像。由于图像非常大,因此我无法在32位系统上同时将所有四个图像以及输入和输出图像保留在内存中。结果,我将每个镜像放在磁盘上,然后分批读取。
在多线程之前,伪代码如下所示:
for (y is 0 to ysize)
unsigned short* ptr1 = ReadLineFromDisk(image1, y)
unsigned short* ptr2 = ReadLineFromDisk(image2, y)
unsigned short* ptr3 = ReadLineFromDisk(image3, y)
unsigned short* ptr4 = ReadLineFromDisk(image4, y)
unsigned short* outPtr = &(outImage[y*inXSize])
for (x is 0 to xsize, ++x, ++ptr1, ++ptr2, ++ptr3, ++ptr4, ++outPtr){
outPtr = combination of ptr1, ptr2, ptr3, ptr4;
}
}
chunksize = 100;
for (y is 0 to ysize by chunksize)
unsigned short* ptr1 = ReadChunkFromDisk(image1, y)
unsigned short* ptr2 = ReadChunkFromDisk(image2, y)
unsigned short* ptr3 = ReadChunkFromDisk(image3, y)
unsigned short* ptr4 = ReadChunkFromDisk(image4, y)
unsigned short* outPtr = &(outImage[y*inXSize])
for (x is 0 to xsize*chunk, ++x, ++ptr1, ++ptr2, ++ptr3, ++ptr4, ++outPtr){
outPtr = combination of ptr1, ptr2, ptr3, ptr4;
}
}
chunksize = 100;
parallel_for (y is 0 to ysize by chunksize in a lambda expression)
unsigned short* ptr1 = ReadChunkFromDisk(image1, y)
unsigned short* ptr2 = ReadChunkFromDisk(image2, y)
unsigned short* ptr3 = ReadChunkFromDisk(image3, y)
unsigned short* ptr4 = ReadChunkFromDisk(image4, y)
unsigned short* outPtr = &(outImage[y*inXSize])
for (x is 0 to xsize*chunk, ++x, ++ptr1, ++ptr2, ++ptr3, ++ptr4, ++outPtr){
outPtr = combination of ptr1, ptr2, ptr3, ptr4;
}
}
最佳答案
答案1:是的,您受磁盘限制,因此不会过多固定CPU,是的,读取较大的块会更有效(只要这些块与磁盘缓存对齐)。
答案2:具有8 MB高速缓存且以10k RPM旋转的磁盘可能会获得60至80 MB/sec的吞吐量,因此“最佳点”将是读取与高速缓存大小对齐的块。您可以增加缓冲区,但要使其与缓存大小保持一致:即8MB,16MB,32MB等。
答案3:理想情况下,您希望将一个线程专用于从磁盘读取,而另一个专用于处理数据(您可能希望使用多个线程进行处理)。读取磁盘的多线程可能会稍微提高性能,但是通常不是这样。我不知道为什么当您增加4倍时,您会认为“其他”正在发生。
答案3更新:
坦白地说,我也不完全知道为什么会发生这种情况,但是我也已经在.NET应用程序中的多线程磁盘I/O上看到了这一点。事实上,我什至have a C# test example which demonstrates the same kind of performance increase注意到了。请注意,在我的测试中,我正在加载HTML页面,这些页面大致与您在“野生”状态下看到的页面相同(每个页面大约80至160 KB),因此我没有将读取的内容与磁盘缓存对齐。实际上,一次读取多个线程可能更有效率,因为尽管您进行了多次读取,但您仍在利用磁盘缓存。当然,这只是一个临时的假设,即我尚无证据可支持,因此请带一点盐!我认为,如果文件足够大,并且磁盘读取线程实际上具有与磁盘缓存对齐的缓冲区,那么添加更多线程根本不会提高速度。 如果您仍然看到速度有所提高,请告诉我们!
答案4:
请尝试以下方法:
关于multithreading - 为什么多线程处理此代码会导致时序不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6339216/
我想选择一个类的所有元素。然后将该类更改为另一个类。 0.5 秒后,我想将元素恢复到原来的类。我必须连续这样做 8 次。即使我的代码实现了(以某种方式),我也看不到按钮的颜色变化。谁能帮我 ?我猜这是
我目前正在尝试用 C++ 编写一个 NES 模拟器,作为一个夏季编程项目,为下一学年的秋季学期做准备(我已经有一段时间没有编码了)。我已经编写了一个 Chip8 模拟器,所以我认为下一步是尝试编写一个
我有 2 个函数依次调用,x 和 y 是全局变量。 function setVariables() { x = 2; y = 10; }; function useVaria
我正在尝试以重复的方式播放 1000 毫秒的 wav 文件。因此,播放 1000 毫秒,然后播放 1000 毫秒的静音,然后再次播放 1000 毫秒的音频,... 但是当我在此过程中打印计时时,我注意
我正在为一个特殊的相机编写一个内核模块,通过 V4L2 处理帧到用户空间代码的传输。然后我在应用程序中做很多用户空间的事情。 时间在这里非常关键,所以我一直在做大量的性能分析和普通的旧 std::ch
据我了解,awakeFromNib 始终会在 viewDidLoad 之前调用。 所以我有一个 UITableViewController 的子类,它是从 xib 文件中取消存档的。 我在里面定义了这
我的powershell脚本运行缓慢,有什么办法可以分析powershell脚本吗? 最佳答案 在这里发布您的脚本真的有助于给出准确的答案。 您可以使用 Measure-Command 来查看脚本中每
我的CQRS / ES设计中有时间问题。为了便于讨论,让我们基于Microsoft的 有关此主题的示例, session 管理(https://msdn.microsoft.com/en-us/lib
我正在使用 RX 进行一些(非常基本的)事件订阅:- public void StartListening(IObservable observable) { subscription = ob
我会试着问我的问题,这样它就不会以一个简单的争论话题结束。 我最近进入了一个用 C# 编码的应用程序,我正在发现异常机制。我和他们有过一些不好的经历,比如以下 // _sValue is a stri
我正在阅读 Cortex M4 TRM 以了解指令执行周期。但是,那里有一些令人困惑的描述 在 Table of Processor Instuctions , STR需要 2 个周期 . 稍后在 L
我需要在 GPU 端处理一组绘图调用所需的时间跨度。 OpenGL 3.2+ 具有“GL_ARB_timer_query”扩展名。不幸的是,MacOSX 仍然不支持该扩展。 你如何能够在 gpu 端测
我正在 try catch 屏幕而不包括我的应用程序窗口。为此,我首先调用 setVisible(false),然后调用 createScreenCapture 方法,最后调用 setVisible(
我们试图实现的功能的简短描述:我们在左边有一个源对象列表,一个人可以将新项目从列表拖到右边的列表中,项目因此被添加到列表中在右侧;他们还可以从右侧的列表中删除项目。右侧的列表在更改时会被保存。 (我认
我是一名优秀的程序员,十分优秀!