首页 > 解决方案 > 为什么 Android 应用程序上的多线程使用更多计算时间?

问题描述

我正在开发一个应用程序,它可以同时处理图像(在 OpenCV 中使用 Dnn.forward())。我为每 1 个线程分配 1 个图像。我在有 8 个内核的三星 S10+ 上运行我的应用程序。然后,我比较了 1 线程、2 线程、4 线程和 8 线程之间的性能。我发现整体计算时间略有减少,但是当我增加线程数时,每个线程的计算时间增加了。

例如,

void singleThread(){
   new Thread(new Runnable() {
           @Override public void run() {
               Long start = System.currentTimeMillis();
               processImage(image);
               Long finish = System.currentTimeMillis();
               Log.i(TAG, "Process time: " + ((finish - start)/1000.0) + " seconds");
           }
   });
}

void twoThread(){
   new Thread(new Runnable() {
           @Override public void run() {
               Long start = System.currentTimeMillis();
               processImage(image);
               Long finish = System.currentTimeMillis();
               Log.i(TAG, "Process time: " + ((finish - start)/1000.0) + " seconds");
           }
   });
   new Thread(new Runnable() {
           @Override public void run() {
               Long start = System.currentTimeMillis();
               processImage(image);
               Long finish = System.currentTimeMillis();
               Log.i(TAG, "Process time: " + ((finish - start)/1000.0) + " seconds");
           }
   });
}

void process(Mat image){
   Mat blob = Dnn.blobFromImage(image, SCALE_FACTOR, new Size(WIDTH, HEIGHT), new Scalar(MEAN_VAL, MEAN_VAL, MEAN_VAL), false, false);

   network = Dnn.readNetFromCaffe(configUri, weightPath);
   network.setInput(blob);
   Mat detection = network.forward();
}

结果,单个线程的“处理时间”为 2.5 秒,但两个线程的“处理时间”为 3.5 和 4 秒。但是,当我使用 8 个线程时,“处理时间”为 19 秒。

我的问题是,如果我有 8 个内核并且使用 8 个线程,为什么每个线程不需要 2.5 秒来处理图像?为什么每个线程需要 19 秒来处理图像?

是不是因为在处理图像时没有核​​心处理其他线程,然后导致上下文切换开销?

先感谢您。

标签: javaandroidmultithreadingopencv

解决方案


推荐阅读