NIO 里面, SocketChannel.connect 的时候发生了什么?

2020-02-23 11:11:12 +08:00
 aguesuka

这段代码在我的机器( winodws 4 核 8 线程)上要执行 5~6 秒,如果把注释去掉也要超过 1 秒。单线程平均每个连接要花费 0.5ms 在创建核连接上,但是多线程执速度是 4 倍,貌似不是 io 密集操作?源码的底层就是加锁调用 native 方法,为什么会这么慢?这是现在系统的瓶颈之一,有必要单独开个线程池来处理吗?

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        IntStream.range(0, 10000)/*.parallel()*/.forEach(i -> {
            try {
                SocketChannel channel = SocketChannel.open();
                channel.configureBlocking(false);
                channel.connect(new InetSocketAddress(8888));
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        });

        long cost = System.currentTimeMillis() - start;
        System.out.println(cost);
    }
2823 次点击
所在节点    Java
3 条回复
leonme
2020-02-23 11:35:19 +08:00
不是很懂啊,把这个'SocketChannel channel = SocketChannel.open();'放到循环外面呢?
aguesuka
2020-02-23 11:39:16 +08:00
@leonme open 的速度大概是 0.1ms/次。时间的大头在 connect 哪里(虽然 open 也很慢)
SoloCompany
2020-02-23 13:54:35 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646759

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX