cpp-httplib icon indicating copy to clipboard operation
cpp-httplib copied to clipboard

Windows req/res very slow compared to Linux

Open hconcessa opened this issue 1 year ago • 3 comments

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"

hconcessa avatar Feb 12 '24 15:02 hconcessa

I´ve made some unit tests based on your code and had similar results:

On Linux: Linux

On Windows: Windows

rpmocchet avatar Feb 22 '24 16:02 rpmocchet

@hconcessa @rpmocchet sorry for the late reply. I'll take a look at the behavior on my Windows machine when I have time. Thanks!

yhirose avatar Feb 26 '24 12:02 yhirose

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

J-dev740 avatar Jun 03 '24 21:06 J-dev740

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; }

q2a3z avatar Jun 19 '24 02:06 q2a3z