java - 为什么 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 秒来处理图像?
是不是因为在处理图像时没有核心处理其他线程,然后导致上下文切换开销?
先感谢您。
解决方案
推荐阅读
- c++ - 为什么 struct array emp[9999] 的声明出错?
- javascript - 更新函数后在函数中记录状态,仍然输出初始状态
- python - AttributeError:模块 'turtle' 没有属性 'turtle'
- r - 使用 R 循环使用多列过滤器
- node.js - 我无法安装 bcrypt
- multiprocessing - DASK python库中的工人定义,为什么工人比cpu核心多
- python - 函数不附加元素 data1 或 data2(python 继承)
- git - 如何以编程方式查找 Git 冲突周围的行号?
- docker-compose - whatsapp业务api给出错误wacore未实例化
- xml - 将 XSL 模板应用于通过键功能选择的元素