gpt4 book ai didi

c - 为什么这个基准代码使用如此高的 CPU?

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:15 25 4
gpt4 key购买 nike

下面的代码有效,它发送所有正确的数据,并接收正确的数据。

当我用它来对一个非常快的服务器进行基准测试时,基准测试的 CPU 使用率约为 10%。但是,当我对速度较慢的服务器进行基准测试时,这个比例上升到约 50%——与我正在进行基准测试/压力测试的服务器相同*。

这是根据 top 的报告进行的。

为什么会占用这么多 CPU?我怀疑我在滥用民意调查,但我不确定如何?

慢速服务器的 CPU 时间是基准测试的 4 倍,而快速服务器的 CPU 时间是基准测试的 7 倍。

int flags = fcntl(sockfd, F_GETFL, 0);
assert(flags != -1);
assert(fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) != -1);

int32 red = 0;
struct pollfd pollfd = {
.fd = sockfd,
.events = POLLIN | POLLOUT
};
do {
assert(poll(&pollfd, 1, -1) == 1);
if (pollfd.revents & POLLOUT) {
int n;
while ((n = send(sockfd, buf__+bufOffset, bufLength-bufOffset, MSG_NOSIGNAL)) > 0) {
bufOffset += n;
if (n != bufLength-bufOffset)
break;
}
assert(!(n == -1 && errno != EAGAIN && errno != EWOULDBLOCK));
}

if (pollfd.revents & POLLIN) {
int r;
while ((r = read(sockfd, recvBuf, MIN(recvLength-red, recvBufLength))) > 0) {
// assert(memcmp(recvBuf, recvExpectedBuf+red, r) == 0);
red += r;
if (r != MIN(recvLength-red, recvBufLength))
break;
}
assert(!(r == -1 && errno != EAGAIN && errno != EWOULDBLOCK));
}
} while (bufOffset < bufLength);

assert(fcntl(sockfd, F_SETFL, flags & ~O_NONBLOCK) != -1);
int r;
while ((r = read(sockfd, recvBuf, MIN(recvLength-red, recvBufLength))) > 0) {
// assert(memcmp(recvBuf, recvExpectedBuf+red, r) == 0);
red += r;
}
assert(fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) != -1);

assert(red == recvLength);

int r = read(sockfd, recvBuf, 1);
assert((r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) || r == 0);

*(目前我在同一台机器上同时运行基准测试和服务器。通信是通过 TCP 进行的。)

最佳答案

原因是您正在忙等待。如果 readwrite 返回 EAGAINEWOULDBLOCK,您将连续调用它们。添加一个 select,它将等待直到套接字准备好读取或写入。

关于c - 为什么这个基准代码使用如此高的 CPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21363667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com