在不同机器上执行相同API的时差

时间:2019-05-03 06:37:59

标签: c# c++

我在C#中的应用程序WPF使用C ++库中的API进行图像处理。我需要一次处理六个图像,因为这有六个对象可用。 准备好图像进行处理时,会将其分配给线程池中的线程。下面的代码用于此目的。

ThreadPool.QueueUserWorkItem(ThreadPoolCallback, imageTuple);

在“ ThreadPoolCallback”中,正在调用图像处理API。

关于我的问题,在我的开发笔记本电脑中,仅执行API的时间为3-3.5秒。但是,如果在具有更好规格的IPC的自动化系统中执行相同的代码,则API执行时间将缩短至8-9秒。

我的开发机器具有8核处理器和16 GB内存 自动化系统中的IPC具有14个核心处理器和32 GB内存。

我已经检查了一些基本内容,例如内存增加,CPU使用率提高。但他们都没有表现出任何担忧。两种系统的唯一区别是IPC已安装了NI Labview。

正在寻找一些建议来缩短我的并行执行时间。是否可以使用专用内核或其他任何内核。

预先感谢

ThreadPool.QueueUserWorkItem(ThreadPoolCallback, imageTuple);

public void ThreadPoolCallback(Object threadContext)
        {
            try
            {

                var result = visionProcessingUnit.ExecuteInspection(imageTuple.Item3, imageTuple.Item2.ImageData, VIBitmap.Width, VIBitmap.Height);;
            }
            catch (Exception ex)
            {
                Logger.Exception("VisionHandler.cs", ex);

            }
        }

2 个答案:

答案 0 :(得分:0)

首先,您应该确保实时系统真正更快地处理6个线程。您可以在两个系统上下载并解压缩7zip,并通过6个线程从命令行运行一些基准测试:

7z b -mmt6

答案 1 :(得分:0)

ThreadPool线程不适用于长时间运行的任务,可能会被某些网络框架进程占用。通常,每个CPU在线程池中有250个线程可用。另外,您可以检查您是否在方法中锁定了某些代码,从而阻止了线程池调度。

如果任务很耗时,我建议您不要使用线程池线程。

下面是两个可以使用的选项,它们将使用新线程而不是线程池一个。

var imageTuple = "blqhblah";
Task.Factory.StartNew(() => ThreadPoolCallback(imageTuple),TaskCreationOptions.LongRunning);

 var thread=new Thread(()=>ThreadPoolCallback(imageTuple));
 thread.Priority = ThreadPriority.AboveNormal;
 thread.Start();