cpp-httplib
cpp-httplib copied to clipboard
Windows req/res very slow compared to Linux
I'm using gtest to do some performance testing. On Linux I have less than 1 ms, but the same code on Windows has ~30ms.
I think it's a significant difference, but i don't undestand why
Client
// Create client
httplib::Client cli(ADDR, PORT);
ASSERT_TRUE(cli.is_valid());
httplib::Result res;
// Measure the get req/res time
auto start_time = std::chrono::high_resolution_clock::now();
res = cli.get(ROUTE_GET_TEST_TEXT);
auto end_time = std::chrono::high_resolution_clock::now();
auto elapsed_time = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time).count();
// Verify response
ASSERT_TRUE(res);
ASSERT_TRUE(res != nullptr);
EXPECT_EQ(httplib::StatusCode::OK_200, res->status);
EXPECT_EQ(httplib::Error::Success, res.error());
EXPECT_EQ(TXT_DEFAULT_RESPONSE, res->body);
// Verify elapsed time
ASSERT_LE(elapsed_time, TIME_GET_US);
Server handle:
_svr.Get(ROUTE_GET_TEST_TEXT, [&](const httplib::Request& req, httplib::Response& res) {
res.set_content(TXT_DEFAULT_RESPONSE, "text/plain");
});
Common:
#define ADDR "127.0.0.1"
#define PORT 8181
#define TXT_DEFAULT_RESPONSE "Default Response to txt request"
I´ve made some unit tests based on your code and had similar results:
On Linux:
On Windows:
@hconcessa @rpmocchet sorry for the late reply. I'll take a look at the behavior on my Windows machine when I have time. Thanks!
hey can somebody give me some documentation about how to get started as I am running this on my windows after cloning the repo it's showing error since in vscode while doing cmake --build . it shows errors like CreateFile2 is not in global namespace can anybody help I'm new to this
Hey Guys. I did some time investigation on the client side in Win64 PC. I found socket_t create_socket will took 1ms to process.
So I suspected WSASocketW took so much time, and got it. But even I forced it to ues the std.socket to create a socket. It also cost around 1ms. Is any possiable when Win create a socket will take more time than Linux or BSD? I don't have Linux or BSD eniviroment right now. Can you test this patten for me? Thank you.
for (auto rp = result; rp; rp = rp->ai_next) {
// Create a socket
#ifdef _WIN32
auto sock =
WSASocketW(rp->ai_family, rp->ai_socktype, rp->ai_protocol, nullptr, 0,
WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED);
/*...*/
if (sock == INVALID_SOCKET) {
sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
}
#else
auto sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
#endif
if (sock == INVALID_SOCKET) { continue; }