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

Time difference in executing same API in different machines

本文关键字:API 时间差 机器 执行      更新时间:2023-10-16

我在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);
            }
        }

首先,您应该确保实时系统处理6个线程的速度更快。您可以在两个系统上下载和解开拉链7ZIP,并通过6个线程从Commandline运行一些基准:

7z b -mmt6

线程池线程不适合长时间运行的任务,并且可能会在某些Net Framework过程中占用。通常,线程池中的每个CPU 250个线程。此外,您可以检查是否在方法中锁定了一些阻止线程池计划的代码。

我建议您如果任务耗时,请勿使用线程池线程。

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

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

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