V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aguesuka
V2EX  ›  Java

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

  •  
  •   aguesuka · 2020-02-23 11:11:12 +08:00 · 2835 次点击
    这是一个创建于 1747 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这段代码在我的机器( 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);
        }
    
    第 1 条附言  ·  2020-02-23 12:23:42 +08:00
    我在 linux 虚拟机里得到了相反的结果。60000 个连接单线程只要 2 秒,多线程反而更慢,和预计的差不多。但是 windows 这个怎么解决?
    3 条回复    2020-02-23 13:54:35 +08:00
    leonme
        1
    leonme  
       2020-02-23 11:35:19 +08:00
    不是很懂啊,把这个'SocketChannel channel = SocketChannel.open();'放到循环外面呢?
    aguesuka
        2
    aguesuka  
    OP
       2020-02-23 11:39:16 +08:00
    @leonme open 的速度大概是 0.1ms/次。时间的大头在 connect 哪里(虽然 open 也很慢)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3250 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 13:13 · PVG 21:13 · LAX 05:13 · JFK 08:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.