V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
aguesuka
V2EX  ›  Java

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

  •  
  •   aguesuka · Feb 23, 2020 · 3573 views
    This topic created in 2256 days ago, the information mentioned may be changed or developed.

    这段代码在我的机器( 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);
        }
    
    Supplement 1  ·  Feb 23, 2020
    我在 linux 虚拟机里得到了相反的结果。60000 个连接单线程只要 2 秒,多线程反而更慢,和预计的差不多。但是 windows 这个怎么解决?
    3 replies    2020-02-23 13:54:35 +08:00
    leon0318
        1
    leon0318  
       Feb 23, 2020
    不是很懂啊,把这个'SocketChannel channel = SocketChannel.open();'放到循环外面呢?
    aguesuka
        2
    aguesuka  
    OP
       Feb 23, 2020
    @leonme open 的速度大概是 0.1ms/次。时间的大头在 connect 哪里(虽然 open 也很慢)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5082 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 05:39 · PVG 13:39 · LAX 22:39 · JFK 01:39
    ♥ Do have faith in what you're doing.