使用多个线程可以更快地执行

时间:2012-01-27 00:00:40

标签: vb.net multithreading algorithm

近似程序行为: 我有一个地图图像,其中的数据与RGB索引指示的地图相关联。数据已填充到MS Access数据库中。我将数据库中的信息作为数组导入到我的程序中,并按照我希望程序运行的顺序对它们进行排序。

我希望程序找到与被比较的现有像素具有不同颜色的最近像素。 (颜色存储为对象Pixel的字符串属性)

第一个问题: 我应该使用整数代表我的颜色而不是字符串吗?这会使比较功能运行得更快吗?

为了找到不同颜色的最近像素,程序以现任者周围的所有8个相邻像素开始。如果没有找到非匹配,则它继续到下一个“度”,并且以这种方式,它从现有像素螺旋出来,直到它击中非匹配。找到后,nonMatch的颜色将保存为现任者的属性。找到每个像素的nonMatch后,数据将重新插入数据库

程序以我编写的方式完成了我想要的东西,但速度非常慢。 24小时后,执行时我只有3%左右。

问题二: 我的程序行为是否合适?如果你必须完成这项任务,你会使用这个算法吗?

问题三: 我是否适合使用线程来更快地完成程序的执行?这究竟是如何工作的? (我是线程新手,但知道一点语法)

问题四: 我的程序是否更加“智能”为每个像素找到nonMatch并在找到它后立即将其插入数据库? (我猜测这在多线程中会很好,因为当一条记录访问数据库(插入)时,另一条记录正在访问像素数组(程序中的共享全局变量)。

问题五: 如果线程是一个好主意,我猜我会将记录分成更易于管理的块(即四分之一),并让每个线程运行相同的功能他们指定的记录数量?我完全关闭了吗?

如果我能澄清或提供代码示例,请告诉我,我只是认为这更像是一个概念主题,所以不要让帖子负担过重。

3 个答案:

答案 0 :(得分:2)

1。)是的,整数比字符串要快得多。此外,y使用更少的内存

2。)我会以这种方式调整算法:

例如:#1:让我们说,对于像素(87,23),你发现最近的非匹配是(88,24)在度= 1 - 你可以立即反转关系并记录,即最近的非匹配( 88,24)是(87,23)。在度数= 1时,你完成了2个像素,一次搜索。

E.g。 #2:比方说,对于像素(17,18),你发现最近的非匹配是(17,20)在度= 2。您可以立即记录,在(16,19),(17,19)和(18,19)两个边界上的所有像素在度数= 1处具有最近的noMatch(17,20),并且其中一个是最近的noMatch到(17,20)。在度数= 2(或更高)时,您通过1次搜索完成了5个像素。

3。)使用线程是一个双面剑:您可以并行执行搜索,但如果您写入数组则需要锁定。所以这取决于你可以在这个问题上投入多少CPU内核。如果这是3或更多,线程肯定会加快搜索速度。

4。)2。)的结果使得有必要在数组中将像素标记为“完成”,因为您可能已经完成了5个像素的搜索。我建议你把它们放入队列并使用专用线程将队列写回数据库:MS Access无法处理并发更新,因此单个数据库编写器线程看起来是个好主意。

5.。)我建议你不要把数组分块:你会遇到一个问题,那就是在一个块的边缘有像素,这些像素的最近的nonMatch在不同的块中。相反,如果您使用例如4个线程,让它们运行1.)从NW角E,然后S 2.)从SE Corner W,然后是N 3.)从NE Corner S,然后是W 4.从SW Corner N,然后是E

答案 1 :(得分:1)

  1. 是。使用整数会使速度更快
  2. 您可以重复使用之前像素所做的工作。例如。如果(a,b)是(x,y)最接近的非等像素,则(x,y)周围的点可能也有(a,b)作为最接近的非等像素
  3. 您可以使用不同的线程处理不同的像素,而不是分割搜索一个像素
  4. 恕我直言,第1步和第2步应该使你的程序更快,你可能不需要多线程。

答案 2 :(得分:0)

是的,如果您打算在屏幕上显示颜色字符串,我会将颜色字符串转换为整数以获得速度,甚至是颜色结构。

如果可以避免,请不要直接使用数据库。在开始之前将必要的数据从数据库中复制到数组中,并在完成后将结果复制回来。