2
0

benchmark_https.pp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. (*
  2. This file is part of libmicrohttpd
  3. Copyright (C) 2007, 2013 Christian Grothoff (and other contributing authors)
  4. This library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public
  6. License as published by the Free Software Foundation; either
  7. version 2.1 of the License, or (at your option) any later version.
  8. This library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public
  13. License along with this library; if not, write to the Free Software
  14. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  15. *)
  16. (**
  17. * @file benchmark_https.pp (Original: benchmark_https.c)
  18. * @brief minimal code to benchmark MHD GET performance with HTTPS
  19. * @author Christian Grothoff / Silvio Clécio
  20. *)
  21. program benchmark_https;
  22. {$mode objfpc}{$H+}
  23. {$MACRO ON}
  24. {$IF DEFINED(CPU_COUNT) and (CPU_COUNT + 0) < 2}
  25. {$UNDEF CPU_COUNT}
  26. {$ENDIF}
  27. {$IF NOT DEFINED(CPU_COUNT)}
  28. {$DEFINE CPU_COUNT := 2}
  29. {$ENDIF}
  30. uses
  31. {$IFDEF MSWINDOWS}
  32. WinSock2,
  33. {$ELSE}
  34. BaseUnix, Unix,
  35. {$ENDIF}
  36. cmem, sysutils, cutils, libmicrohttpd;
  37. const
  38. PAGE: Pcchar = '<html><head><title>libmicrohttpd demo</title></head><body>libmicrohttpd demo</body></html>';
  39. SMALL = 1024 * 128;
  40. NUMBER_OF_THREADS = CPU_COUNT;
  41. var
  42. small_deltas: array[0..SMALL] of cuint;
  43. response: PMHD_Response;
  44. procedure completed_callback(cls: Pointer; connection: PMHD_Connection;
  45. con_cls: PPointer; toe: MHD_RequestTerminationCode); cdecl;
  46. var
  47. tv: ptimeval;
  48. tve: timeval;
  49. delta: cuint64;
  50. begin
  51. tv := con_cls^;
  52. if nil = tv then
  53. Exit;
  54. fpgettimeofday(@tve, nil);
  55. delta := 0;
  56. if tve.tv_usec >= tv^.tv_usec then
  57. delta += (tve.tv_sec - tv^.tv_sec) * 1000000 +
  58. (tve.tv_usec - tv^.tv_usec)
  59. else
  60. delta += (tve.tv_sec - tv^.tv_sec) * 1000000 -
  61. tv^.tv_usec + tve.tv_usec;
  62. if delta < SMALL then
  63. Inc(small_deltas[delta])
  64. else
  65. WriteLn(stdout, Format('D: %u 1', [delta]));
  66. Free(tv);
  67. end;
  68. function uri_logger_cb(cls: Pointer; uri: Pcchar): Pointer; cdecl;
  69. var
  70. tv: ptimeval;
  71. begin
  72. tv := Malloc(SizeOf(timeval));
  73. if nil <> tv then
  74. fpgettimeofday(tv, nil);
  75. Result := tv;
  76. end;
  77. function ahc_echo(cls: Pointer; connection: PMHD_Connection; url: Pcchar;
  78. method: Pcchar; version: Pcchar; upload_data: Pcchar;
  79. upload_data_size: Psize_t; ptr: PPointer): cint; cdecl;
  80. begin
  81. if 0 <> strcomp(method, 'GET') then
  82. Exit(MHD_NO);
  83. Result := MHD_queue_response(connection, MHD_HTTP_OK, response);
  84. end;
  85. const
  86. srv_signed_key_pem: array[0..1674] of AnsiChar =
  87. '-----BEGIN RSA PRIVATE KEY-----'#10+
  88. 'MIIEowIBAAKCAQEAvfTdv+3fgvVTKRnP/HVNG81cr8TrUP/iiyuve/THMzvFXhCW'#10+
  89. '+K03KwEku55QvnUndwBfU/ROzLlv+5hotgiDRNFT3HxurmhouySBrJNJv7qWp8IL'#10+
  90. 'q4sw32vo0fbMu5BZF49bUXK9L3kW2PdhTtSQPWHEzNrCxO+YgCilKHkY3vQNfdJ0'#10+
  91. '20Q5EAAEseD1YtWCIpRvJzYlZMpjYB1ubTl24kwrgOKUJYKqM4jmF4DVQp4oOK/6'#10+
  92. 'QYGGh1QmHRPAy3CBII6sbb+sZT9cAqU6GYQVB35lm4XAgibXV6KgmpVxVQQ69U6x'#10+
  93. 'yoOl204xuekZOaG9RUPId74Rtmwfi1TLbBzo2wIDAQABAoIBADu09WSICNq5cMe4'#10+
  94. '+NKCLlgAT1NiQpLls1gKRbDhKiHU9j8QWNvWWkJWrCya4QdUfLCfeddCMeiQmv3K'#10+
  95. 'lJMvDs+5OjJSHFoOsGiuW2Ias7IjnIojaJalfBml6frhJ84G27IXmdz6gzOiTIer'#10+
  96. 'DjeAgcwBaKH5WwIay2TxIaScl7AwHBauQkrLcyb4hTmZuQh6ArVIN6+pzoVuORXM'#10+
  97. 'bpeNWl2l/HSN3VtUN6aCAKbN/X3o0GavCCMn5Fa85uJFsab4ss/uP+2PusU71+zP'#10+
  98. 'sBm6p/2IbGvF5k3VPDA7X5YX61sukRjRBihY8xSnNYx1UcoOsX6AiPnbhifD8+xQ'#10+
  99. 'Tlf8oJUCgYEA0BTfzqNpr9Wxw5/QXaSdw7S/0eP5a0C/nwURvmfSzuTD4equzbEN'#10+
  100. 'd+dI/s2JMxrdj/I4uoAfUXRGaabevQIjFzC9uyE3LaOyR2zhuvAzX+vVcs6bSXeU'#10+
  101. 'pKpCAcN+3Z3evMaX2f+z/nfSUAl2i4J2R+/LQAWJW4KwRky/m+cxpfUCgYEA6bN1'#10+
  102. 'b73bMgM8wpNt6+fcmS+5n0iZihygQ2U2DEud8nZJL4Nrm1dwTnfZfJBnkGj6+0Q0'#10+
  103. 'cOwj2KS0/wcEdJBP0jucU4v60VMhp75AQeHqidIde0bTViSRo3HWKXHBIFGYoU3T'#10+
  104. 'LyPyKndbqsOObnsFXHn56Nwhr2HLf6nw4taGQY8CgYBoSW36FLCNbd6QGvLFXBGt'#10+
  105. '2lMhEM8az/K58kJ4WXSwOLtr6MD/WjNT2tkcy0puEJLm6BFCd6A6pLn9jaKou/92'#10+
  106. 'SfltZjJPb3GUlp9zn5tAAeSSi7YMViBrfuFiHObij5LorefBXISLjuYbMwL03MgH'#10+
  107. 'Ocl2JtA2ywMp2KFXs8GQWQKBgFyIVv5ogQrbZ0pvj31xr9HjqK6d01VxIi+tOmpB'#10+
  108. '4ocnOLEcaxX12BzprW55ytfOCVpF1jHD/imAhb3YrHXu0fwe6DXYXfZV4SSG2vB7'#10+
  109. 'IB9z14KBN5qLHjNGFpMQXHSMek+b/ftTU0ZnPh9uEM5D3YqRLVd7GcdUhHvG8P8Q'#10+
  110. 'C9aXAoGBAJtID6h8wOGMP0XYX5YYnhlC7dOLfk8UYrzlp3xhqVkzKthTQTj6wx9R'#10+
  111. 'GtC4k7U1ki8oJsfcIlBNXd768fqDVWjYju5rzShMpo8OCTS6ipAblKjCxPPVhIpv'#10+
  112. 'tWPlbSn1qj6wylstJ5/3Z+ZW5H4wIKp5jmLiioDhcP0L/Ex3Zx8O'#10+
  113. '-----END RSA PRIVATE KEY-----'#10;
  114. srv_signed_cert_pem: array[0..1138] of AnsiChar =
  115. '-----BEGIN CERTIFICATE-----'#10+
  116. 'MIIDGzCCAgWgAwIBAgIES0KCvTALBgkqhkiG9w0BAQUwFzEVMBMGA1UEAxMMdGVz'#10+
  117. 'dF9jYV9jZXJ0MB4XDTEwMDEwNTAwMDcyNVoXDTQ1MDMxMjAwMDcyNVowFzEVMBMG'#10+
  118. 'A1UEAxMMdGVzdF9jYV9jZXJ0MIIBHzALBgkqhkiG9w0BAQEDggEOADCCAQkCggEA'#10+
  119. 'vfTdv+3fgvVTKRnP/HVNG81cr8TrUP/iiyuve/THMzvFXhCW+K03KwEku55QvnUn'#10+
  120. 'dwBfU/ROzLlv+5hotgiDRNFT3HxurmhouySBrJNJv7qWp8ILq4sw32vo0fbMu5BZ'#10+
  121. 'F49bUXK9L3kW2PdhTtSQPWHEzNrCxO+YgCilKHkY3vQNfdJ020Q5EAAEseD1YtWC'#10+
  122. 'IpRvJzYlZMpjYB1ubTl24kwrgOKUJYKqM4jmF4DVQp4oOK/6QYGGh1QmHRPAy3CB'#10+
  123. 'II6sbb+sZT9cAqU6GYQVB35lm4XAgibXV6KgmpVxVQQ69U6xyoOl204xuekZOaG9'#10+
  124. 'RUPId74Rtmwfi1TLbBzo2wIDAQABo3YwdDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQM'#10+
  125. 'MAoGCCsGAQUFBwMBMA8GA1UdDwEB/wQFAwMHIAAwHQYDVR0OBBYEFOFi4ilKOP1d'#10+
  126. 'XHlWCMwmVKr7mgy8MB8GA1UdIwQYMBaAFP2olB4s2T/xuoQ5pT2RKojFwZo2MAsG'#10+
  127. 'CSqGSIb3DQEBBQOCAQEAHVWPxazupbOkG7Did+dY9z2z6RjTzYvurTtEKQgzM2Vz'#10+
  128. 'GQBA+3pZ3c5mS97fPIs9hZXfnQeelMeZ2XP1a+9vp35bJjZBBhVH+pqxjCgiUflg'#10+
  129. 'A3Zqy0XwwVCgQLE2HyaU3DLUD/aeIFK5gJaOSdNTXZLv43K8kl4cqDbMeRpVTbkt'#10+
  130. 'YmG4AyEOYRNKGTqMEJXJoxD5E3rBUNrVI/XyTjYrulxbNPcMWEHKNeeqWpKDYTFo'#10+
  131. 'Bb01PCthGXiq/4A2RLAFosadzRa8SBpoSjPPfZ0b2w4MJpReHqKbR5+T2t6hzml6'#10+
  132. '4ToyOKPDmamiTuN5KzLN3cw7DQlvWMvqSOChPLnA3Q=='#10+
  133. '-----END CERTIFICATE-----'#10;
  134. var
  135. d: PMHD_Daemon;
  136. i: cuint;
  137. begin
  138. if argc <> 2 then
  139. begin
  140. WriteLn(argv[0] + ' PORT');
  141. Halt(1);
  142. end;
  143. response := MHD_create_response_from_buffer(Length(PAGE), Pointer(PAGE),
  144. MHD_RESPMEM_PERSISTENT);
  145. d := MHD_start_daemon(MHD_USE_SELECT_INTERNALLY or MHD_USE_SSL
  146. {$IFDEF EPOLL_SUPPORT}
  147. or MHD_USE_EPOLL_LINUX_ONLY or MHD_USE_EPOLL_TURBO
  148. {$ENDIF},
  149. StrToInt(argv[1]), nil, nil, @ahc_echo, nil,
  150. MHD_OPTION_CONNECTION_TIMEOUT, 120,
  151. MHD_OPTION_THREAD_POOL_SIZE, NUMBER_OF_THREADS,
  152. MHD_OPTION_URI_LOG_CALLBACK, @uri_logger_cb, nil,
  153. MHD_OPTION_NOTIFY_COMPLETED, @completed_callback, nil,
  154. MHD_OPTION_CONNECTION_LIMIT, 1000,
  155. MHD_OPTION_HTTPS_MEM_KEY, srv_signed_key_pem,
  156. MHD_OPTION_HTTPS_MEM_CERT, srv_signed_cert_pem,
  157. MHD_OPTION_END);
  158. if d = nil then
  159. Halt(1);
  160. ReadLn;
  161. MHD_stop_daemon(d);
  162. MHD_destroy_response(response);
  163. for i := 0 to SMALL do
  164. if 0 <> small_deltas[i] then
  165. WriteLn(stdout, Format('D: %d %u', [i, small_deltas[i]]));
  166. end.