Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用多线程加快执行速度_Vb.net_Multithreading_Algorithm - Fatal编程技术网

Vb.net 使用多线程加快执行速度

Vb.net 使用多线程加快执行速度,vb.net,multithreading,algorithm,Vb.net,Multithreading,Algorithm,近似程序行为: 我有一个地图图像,其中的数据与RGB索引指示的地图相关。数据已填充到MS Access数据库中。我将数据库中的信息作为数组导入到我的程序中,并按照我希望程序运行的顺序对它们进行排序 我想让程序找到最近的像素,它与正在比较的当前像素具有不同的颜色。(颜色存储为对象像素的字符串属性) 第一个问题:我应该使用整数来表示颜色而不是字符串吗?这会使比较功能运行得更快吗 为了找到不同颜色的最近像素,程序从当前像素周围的所有8个相邻像素开始。如果未找到非匹配,则它将继续到下一个“度”,并以这种

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

我想让程序找到最近的像素,它与正在比较的当前像素具有不同的颜色。(颜色存储为对象像素的字符串属性)

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

为了找到不同颜色的最近像素,程序从当前像素周围的所有8个相邻像素开始。如果未找到非匹配,则它将继续到下一个“度”,并以这种方式从当前像素向外螺旋,直到找到非匹配。找到时,非匹配的颜色将另存为属性。在我找到每个像素的不匹配后,数据被重新插入到数据库中

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

问题二:我的程序行为听起来是否正确?如果你必须完成这个任务,你会使用这个算法吗

问题三:为了更快地完成程序的执行,我使用线程是否合适?这到底是怎么回事?(我是线程新手,但对语法略知一二)

问题四:对于我的程序来说,找到每个像素的不匹配项并在找到后立即将其插入数据库会更“智能”吗?(我猜测这在多线程中会很好,因为当一条记录访问数据库(插入)时,另一条记录访问像素数组(程序中的共享全局变量)

问题五:如果线程化是一个好主意,我猜我会将记录分成更易于管理的块(即四分之一),并让每个线程对其指定数量的记录运行相同的函数?我真的很接近了吗

请让我知道,如果我可以澄清或提供代码样本,我只是觉得这是一个概念性的主题,所以不想负担过重的职位

  • 是的。使用整数会使速度更快
  • 您可以重复使用对上一个像素所做的工作。例如,如果(a,b)是(x,y)中最近的不相等像素,则(x,y)周围的点也可能将(a,b)作为最近的不相等像素
  • 您可以使用不同的线程处理不同的像素,而不是分割搜索一个像素
  • 依我看,步骤1和步骤2应该会让你的程序更快,而且你可能不需要多线程。

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

    2.)我将以这种方式调整算法:

    例如:#1:比方说,对于像素(87,23),你发现最接近的非匹配度为(88,24),阶数=1——你可以立即反转关系并记录,最接近(88,24)的非匹配度为(87,23)。在度=1时,您使用1次搜索完成了2个像素

    例如#2:比方说,对于像素(17,18),在度=2时,您发现最接近的非匹配为(17,20)。您可以立即记录(16,19)、(17,19)和(18,19)上边界的所有像素在阶数=1时具有最近的noMatch(17,20),并且其中一个像素是距离(17,20)最近的noMatch。在度数=2(或更高)时,使用1次搜索完成5个像素

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

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


    5.)我建议您不要将数组分块:如果一个分块的边缘上的像素在另一个分块中具有最近的不匹配,您将遇到问题。相反,如果您使用例如4个线程,则让它们运行1.)从西北角e,然后是S 2.)从东南角W,然后是N 3.)从东北角S,然后是W 4。从西南角N,然后是E是的,我会将颜色字符串转换为整数以提高速度,如果你想在屏幕上显示它们,甚至可以转换为颜色结构


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

    StackOverflow每篇文章只想问一个问题。嗨,Christine,欢迎来到StackOverflow。虽然你的问题很有趣,但话题太多了。关于如何使用线程的问题已经不计其数,如右侧“Related”(相关)列所示,因此我建议从这个问题中删除线程,看看另一个问题是否有适合您的答案。我不再阅读“我应该使用整数吗?”。当然可以。巨大的差异。嗨@Eugen Rieck,非常感谢你的回复。这些建议非常有用,我很高兴明天能尝试一下。干杯