- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个多线程服务器应用程序。该应用程序从套接字接收数据,然后处理这些数据,如解包、添加到数据队列等,功能如下。这个函数被频繁调用。有一个select语句,如果发现有数据就会调用这个函数接收):
//the main function used to receive
//file data from clients
void service(void){
while(1){
....
struct timeval timeout;
timeout.tv_sec = 3;
...
ret = select(maxFd+1, &read_set, NULL, NULL, &timeout);
if (ret > 0){
//get socket from SocketsMap
//if fd in SocketsMap and its being set
//then receive data from the socket
receive_data(fd);
}
}
}
void receive_data(int fd){
const int ONE_MEGA = 1024 * 1024;
//char *buffer = new char[ONE_MEGA]; consumes much less CPU
char buffer[ONE_MEGA]; // cause high CPU
int readn = recv(fd, buffer, ONE_MEGA, 0);
//handle the data
}
我发现上面的代码消耗了太多的 CPU——通常是 80% 到 90%,但是如果我从堆中创建缓冲区而不是 CPU,则只有 14%。为什么?
[更新]
添加了更多代码
[更新2]
最奇怪的是我还写了一个简单的数据接收服务器和客户端。服务器只是从套接字接收数据然后丢弃它。两种类型的空间分配工作几乎相同,CPU 使用率没有太大差异。在出现问题的多线程服务器应用程序中,我什至将进程堆栈大小重置为30M,使用数组仍然导致问题,但是从堆分配解决了它。我不知道为什么。
关于“sizeof(buffer)”,感谢您指出这一点,但我 100% 确定这不是问题所在,因为在我的应用程序中我不使用 sizeof(buffer),而是使用 ONE_MEGA (1024* 1024)代替。
顺便说一句,还有一件事要提,但我不确定它是否有用。 将数组替换为较小的数组,例如“char buffer[1024]; 也会显着降低 cpu 使用率。
[更新3]
所有套接字都处于非阻塞模式。
最佳答案
我刚刚写了这个:
#include <iostream>
#include <cstdio>
using namespace std;
static __inline__ unsigned long long rdtsc(void)
{
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
const int M = 1024*1024;
void bigstack()
{
FILE *f = fopen("test.txt", "r");
unsigned long long time;
char buffer[M];
time = rdtsc();
fread(buffer, M, 1, f);
time = rdtsc() - time;
fclose(f);
cout << "bs: Time = " << time / 1000 << endl;
}
void bigheap()
{
FILE *f = fopen("test.txt", "r");
unsigned long long time;
char *buffer = new char[M];
time = rdtsc();
fread(buffer, M, 1, f);
time = rdtsc() - time;
delete [] buffer;
fclose(f);
cout << "bh: Time = " << time / 1000 << endl;
}
int main()
{
for(int i = 0; i < 10; i++)
{
bigstack();
bigheap();
}
}
输出是这样的:
bs: Time = 8434
bh: Time = 7242
bs: Time = 1094
bh: Time = 2060
bs: Time = 842
bh: Time = 830
bs: Time = 785
bh: Time = 781
bs: Time = 782
bh: Time = 804
bs: Time = 782
bh: Time = 778
bs: Time = 792
bh: Time = 809
bs: Time = 785
bh: Time = 786
bs: Time = 782
bh: Time = 829
bs: Time = 786
bh: Time = 781
换句话说,从堆的栈中分配完全没有区别。开始时的少量“缓慢”与“预热缓存”有关。
而且我相当确信您的代码在两者之间表现不同的原因是其他原因 - 也许 simonc 所说:sizeof buffer
是问题所在?
关于c++ - 大小为 1mega 的大数组导致 CPU 高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921632/
我有一些关于找到一种方法来实现可以与多个收件人共享的任意数据的加密的问题。 Mega似乎正是这样做的。据我所知,它会在将数据上传到 Web 服务器之前对其进行加密。仍然可以与他人共享该文件。加密是如何
我想知道是否有人能够阐明我遇到的问题...... 我在以下网站中使用了 jQuery Mega Menu 脚本: http://www.furnituremind.co.uk/ 我从以下站点找到了脚本
我正在制作一个“大型”下拉菜单。但是,我需要对其进行一点改动,这被证明是一项任务。 要被认为是正确的,它应该如下所示并且每个选项卡下拉列表都需要显示在同一位置,因为它们每个都包含相似的信息。下拉列表的
我正在使用 jQuery Mega Drop Down Menu 插件,我无法开始工作的一件简单的事情是我需要导航文本在菜单中居中。我删除了所有的“float:left;”声明,但导航文本仍在左侧。
我是 css 的新手,但我有一个 css3 大型菜单,我注意到当我去打印页面时,它想要打印出大型菜单中的所有 Material 以及页面上的所有 Material 。如果您想自己测试,请转到此处 ht
我必须读取wav文件(我决定用python来做)并将字节从文件写入串行端口。这是我的 python 代码(进行了一些更改以修复字节传输/接收) import serial, time ser = se
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
当您从 MEGA 服务下载文件时,会出现一个显示下载进度条的网页。在该栏达到 100% 后,您的浏览器将通知用户将文件保存到选定的文件夹中。我知道 Mega 使用 HTML5 文件系统 API 来执行
我对不同字节单位的表示有些困惑。 整个1字节= 8位被接受。 但是,在很多资料中我都看到了 1 kiloByte = 2^10 bytes = 1024 bytes 和 1 kiloByte = 10
执行 mega.login(email,password) 时出现以下错误 Traceback (most recent call last): File "", line 1, in Fi
我正在做一个涉及Arduino Mega(2560)和Waveshare ePaper显示器的小项目(或我认为是这样)。 我已经使它与库(epd7in5)一起正常工作,并将两个图像添加到PROGMEM
我正在尝试使用 WPF 实现“Mega Menu”样式的菜单。要查看网页设计中的大型菜单示例,请参阅 here . 到目前为止,我已经尝试通过使用 TextBlocks 作为最高级别的菜单来创建类似的
目前我正在使用 Bootstrap 3 和 Mega Menu 构建网站。一切都很好,除了一个不愉快的时刻——我的 super 菜单定位错误。它不是在 .container 内部打开,而是忽略容器并在
我正在构建一个仅使用 CSS 的下拉列表。我需要在 周围有一个连续的边框在主导航列表以及嵌套的 中这是悬停时出现的子菜单。 目前我正试图通过定位 来消除子菜单和顶部导航栏相交的顶部边框。下面使用
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve
看看这个非常基本的 Arduino 程序: long pos = 90 * 1023/360; Serial.println(pos); 本应显示255,却显示73,不明白为什么。 此程序在 Ardu
我正在尝试在 Bootstrap 中创建一个 Mega 菜单。我在 Bootsnipp 上找到了一个 super 菜单 https://bootsnipp.com/snippets/featured/
我正在尝试创建一个大型下拉菜单,就像来自以下链接的菜单一样:http://i48.tinypic.com/2ln97ip.png 我已经创建了这个 fiddle ,但是由于第二个 ul 的定位和边界不
我有一个 application它监视文件系统(TeamCity 配置目录),以了解对 XML 配置文件的更改。当检测到更改时,它会提交给 Git(使用 libgit2sharp )。 Git“提交者
我想知道如何更改 bootstrap mega 菜单下拉大小以适合 bootstrap 容器宽度。 我在下面附上了一张图片,以便更好地理解我想做什么。 Boostrap Mega Menu HTML代
我是一名优秀的程序员,十分优秀!