<div dir="ltr">Thanks all,<div><br></div><div>There have been a number of useful suggestions here around improving the test that I was carrying out.  I've modified the code so that it uses {active,true} and can receive multiple chunks of data instead of one main chunk.  I've also run the client and server on different machines and am seeing the difference in performance between gen_tcp and ssl decrease.  </div><div><br></div><div>It is now taking around 2 seconds to transfer 200MB of data using gen_tcp and taking around 10 seconds to transfer the same data using SSL.  A few people had concerns about the way I was measuring the time taken, but I believe this should be ok as I only start measuring time after the initial connection has been established.</div><div><br></div><div>Performance improves marginally if I send it in smaller chunks and the relationship between time taken and size of data seems linear too.</div><div><br></div><div>The code enclosed was to demonstrate the difference in speed between gen_tcp and ssl and the updated results mirror the performance change I see in our own application when accessing data from a HTTPS server.  (I have no control over the security mechanisms exposed by this server)</div><div><br></div><div>For reference, my updated code is shown below.</div><div><br></div><div>Cheers,</div><div>Sean</div><div><br></div><div><br></div><div><div>-module(network_performance).</div><div><br></div><div>-export([client/0,ssl_client/0,server/1,server/2,ssl_server/1,ssl_server/2]).</div><div><br></div><div>client() -></div><div>    SomeHostInNet = "172.16.32.41",</div><div>    {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,</div><div>        [binary, {packet, 0}, {active, true}]),</div><div>    Before = erlang:now(),</div><div>    ok = do_client_recv(Sock),</div><div>    After = erlang:now(),</div><div>    ok = gen_tcp:close(Sock),</div><div>    io:format("Time taken: ~p microsecs~n",[total_microsecs(After) - total_microsecs(Before)]).</div><div><br></div><div>server(Data) -></div><div>    server(Data,1).</div><div><br></div><div>server(Data, NoOfIterations) -></div><div>    {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, raw}, {active, true},{reuseaddr,true}]),</div><div>    {ok, Sock} = gen_tcp:accept(LSock),</div><div>    send_tcp_data(Sock, Data, NoOfIterations),</div><div>    gen_tcp:close(Sock).</div><div><br></div><div>ssl_client() -></div><div>    SomeHostInNet = "172.16.32.41",</div><div>    ssl:start(),</div><div>    {ok, Sock} = ssl:connect(SomeHostInNet, 5679,</div><div>        [binary, {packet, raw}, {active, true}]),</div><div>    ok = ssl:ssl_accept(Sock),</div><div>    Before = erlang:now(),</div><div>    ok = do_client_recv(Sock),</div><div>    After = erlang:now(),</div><div>    ok = ssl:close(Sock),</div><div>    io:format("Time taken: ~p microsecs~n",[total_microsecs(After) - total_microsecs(Before)]).</div><div><br></div><div>ssl_server(Data) -></div><div>    ssl_server(Data, 1).</div><div><br></div><div>ssl_server(_Data, 0) -></div><div>    ok;</div><div>ssl_server(Data, NoOfIterations) -></div><div>    ssl:start(),</div><div>    {ok, LSock} = ssl:listen(5679, [binary, {packet, raw},</div><div>                                        {active, true},{reuseaddr,true},{certfile,"test.pem"},{keyfile,"test.key"}]),</div><div>    {ok, Sock} = ssl:transport_accept(LSock),</div><div>    ok  = ssl:ssl_accept(Sock),</div><div>    send_ssl_data(Sock, Data, NoOfIterations),</div><div>    ssl:close(Sock).</div><div><br></div><div>send_tcp_data(_Sock, _Data, 0) -></div><div>    ok;</div><div>send_tcp_data(Sock, Data, NoOfIterations) -></div><div>    gen_tcp:send(Sock, Data),</div><div>    send_tcp_data(Sock, Data, NoOfIterations - 1).</div><div><br></div><div>send_ssl_data(_Sock, _Data, 0) -></div><div>    ok;</div><div>send_ssl_data(Sock, Data, NoOfIterations) -></div><div>    ssl:send(Sock, Data),</div><div>    send_ssl_data(Sock, Data, NoOfIterations - 1).</div><div><br></div><div>total_microsecs({MegaSecs,Secs,MicroSecs}) -></div><div>    (MegaSecs*1000000 + Secs)*1000000 + MicroSecs.</div><div><br></div><div>do_client_recv(Socket) -></div><div>    do_client_recv(Socket, 0).</div><div><br></div><div>do_client_recv(Socket, Acc) -></div><div>    receive</div><div>        {tcp, Socket, Data} -></div><div>            do_client_recv(Socket, Acc + byte_size(Data));</div><div>        {ssl, Socket, Data} -></div><div>            do_client_recv(Socket, Acc + byte_size(Data));</div><div>        {tcp_closed, Socket} -></div><div>            io:format("Socket closed after transferring ~p bytes of data~n",[Acc]);</div><div>        {ssl_closed, _Socket} -></div><div>            io:format("Socket closed after transferring ~p bytes of data~n",[Acc]);</div><div>        {tcp_error, Socket, Reason} -></div><div>            io:format("Error: ~p~n",[Reason]);</div><div>        {ssl_error, Socket, Reason} -></div><div>            io:format("Error: ~p~n",[Reason]);</div><div>        Else -></div><div>            io:format("Unexpected result: ~p~n",[Else])</div><div>    after 20000 -></div><div>            io:format("Receive timed out~n",[])</div><div>    end.</div></div></div>