4Manuals

  • PDF Cloud HOME

踩踏次数增加导致循环持续时间更长 Download

    春季启动-Couchbase AbstractCouchbaseConfiguration-如何避免覆盖不必要的方法 我不知道(未解决的编译问题:) 加载数据并推送到未显示的RecyclerView中 调用Model类的函数时出现java.lang.NullPointerException 字符串数组在for循环中初始化时忽略索引0 Spring MVC @ModelAttribute未填充AJAX发布请求 需要建议在Java中使用哪个数据库/存储来存储RaftLogs(实现Raft Consensus Algorithm) Tensorflow多线程推理比单线程推理慢 Flutter:Java使用或覆盖已弃用的API @ EnableOAuth2Sso和@EnableResourceServer(同一应用程序中的客户端和资源行为)

我有一种方法,其中的逻辑需要40毫秒左右的时间

当我多次调用此方法(并行)时-每个循环持续时间需要更多时间(很多)。

例如:

1次通话-约40毫秒(平均)

5次通话-约63毫秒(平均)

10次通话-约120毫秒(平均)

100个呼叫-约1200ms(平均)

以此类推...

代码:

int numberOfExecution = 100;
ExecutorService executor = Executors.newFixedThreadPool(numberOfExecution);
for (int i = 0; i < numberOfExecution; i++) {
    executor.execute(new Runnable() {
        @Override
        public void run() {
            MyObject obj1 = readBytesFromFile(1);
            MyObject obj2 = readBytesFromFile(2);
            MyObject obj3 = readBytesFromFile(3);
            MyObject obj4 = readBytesFromFile(4);


            final Map<Integer, MyObject> objects = new TreeMap<>();
            objects.put(0, obj1);
            objects.put(1, obj2);
            objects.put(2, obj3);
            objects.put(3, obj4);

            Foo foo = new Foo(objects);

            long startTime = System.currentTimeMillis();
            Thread.sleep(40); // sleep for 40ms to demonstrate my 40ms logic
            long endTime = System.currentTimeMillis();
            float durationMs = endTime - startTime;

            System.out.println("Foo.bar() duration: " + durationMs);
        }
    });
}

executor.shutdown();
while (!executor.isTerminated()) { }

控制台:

Foo.bar() duration: 41.0
Foo.bar() duration: 40.0
Foo.bar() duration: 43.0
Foo.bar() duration: 41.0
Foo.bar() duration: 40.0
Foo.bar() duration: 41.0
Foo.bar() duration: 41.0
Foo.bar() duration: 48.0
Foo.bar() duration: 62.0
Foo.bar() duration: 48.0
Foo.bar() duration: 48.0
Foo.bar() duration: 48.0
Foo.bar() duration: 48.0
Foo.bar() duration: 49.0
Foo.bar() duration: 48.0
Foo.bar() duration: 49.0
Foo.bar() duration: 40.0
Foo.bar() duration: 40.0
Foo.bar() duration: 40.0
Foo.bar() duration: 40.0
Foo.bar() duration: 40.0
Foo.bar() duration: 40.0
Foo.bar() duration: 40.0
Foo.bar() duration: 41.0
Foo.bar() duration: 40.0
Foo.bar() duration: 41.0
Foo.bar() duration: 41.0
Foo.bar() duration: 42.0
Foo.bar() duration: 49.0
Foo.bar() duration: 40.0
Foo.bar() duration: 40.0
Foo.bar() duration: 49.0
Foo.bar() duration: 74.0
Foo.bar() duration: 40.0
Foo.bar() duration: 70.0
Foo.bar() duration: 40.0
Foo.bar() duration: 50.0
Foo.bar() duration: 43.0
Foo.bar() duration: 40.0
Foo.bar() duration: 43.0
Foo.bar() duration: 56.0
Foo.bar() duration: 63.0
Foo.bar() duration: 45.0
Foo.bar() duration: 40.0
Foo.bar() duration: 41.0
Foo.bar() duration: 43.0
Foo.bar() duration: 43.0
Foo.bar() duration: 48.0
Foo.bar() duration: 41.0
Foo.bar() duration: 58.0
Foo.bar() duration: 59.0
Foo.bar() duration: 55.0
Foo.bar() duration: 42.0
Foo.bar() duration: 40.0
Foo.bar() duration: 42.0
Foo.bar() duration: 70.0
Foo.bar() duration: 40.0
Foo.bar() duration: 41.0
Foo.bar() duration: 75.0
Foo.bar() duration: 40.0
Foo.bar() duration: 43.0
Foo.bar() duration: 40.0
Foo.bar() duration: 41.0
Foo.bar() duration: 67.0
Foo.bar() duration: 59.0
Foo.bar() duration: 40.0
Foo.bar() duration: 57.0
Foo.bar() duration: 42.0
Foo.bar() duration: 40.0
Foo.bar() duration: 41.0
Foo.bar() duration: 43.0
Foo.bar() duration: 41.0
Foo.bar() duration: 40.0
Foo.bar() duration: 41.0
Foo.bar() duration: 42.0
Foo.bar() duration: 41.0
Foo.bar() duration: 40.0
Foo.bar() duration: 42.0
Foo.bar() duration: 42.0
Foo.bar() duration: 41.0
Foo.bar() duration: 45.0
Foo.bar() duration: 44.0
Foo.bar() duration: 40.0
Foo.bar() duration: 42.0
Foo.bar() duration: 41.0
Foo.bar() duration: 40.0
Foo.bar() duration: 40.0
Foo.bar() duration: 45.0
Foo.bar() duration: 41.0
Foo.bar() duration: 40.0
Foo.bar() duration: 44.0
Foo.bar() duration: 41.0
Foo.bar() duration: 42.0
Foo.bar() duration: 40.0
Foo.bar() duration: 42.0
Foo.bar() duration: 41.0
Foo.bar() duration: 42.0
Foo.bar() duration: 42.0
Foo.bar() duration: 43.0
Foo.bar() duration: 43.0

在MacBook Pro i9上运行

我想念什么?

1 个答案:

答案 0 :(得分:1)

机器中的内核数是固定的。随着我们增加需要并行执行的线程数量,将在线程之间进行上下文切换。

请检查https://www.javamex.com/tutorials/threads/context_switch.shtml。

此外,线程之间可能存在资源争用。可以并行运行的最大线程数取决于计算机核心。 简而言之,仅增加线程数将不会提高代码执行性能。



Similar searches
    Val_accuracy(val_acc)非常低 DataFrame按datatime列关闭过滤 如何使用Jest或Sinon模拟Node.js中的Postgresql(pg) 为什么数组不打印第一个元素? 如何从数组中的多个对象中准确提取2个键和值