Saya memiliki aplikasi server multithread. Aplikasi ini menerima data dari soket kemudian menangani data tersebut seperti membongkar paket, menambah antrian data, dll, fungsinya seperti di bawah ini. Fungsi ini sering dipanggil. Ada pernyataan pilih dan jika ditemukan ada data maka akan memanggil fungsi ini untuk menerima):
//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
}
Saya menemukan cara di atas memakan terlalu banyak CPU -- biasanya 80% hingga 90%, tetapi jika saya membuat buffer dari heap, CPU hanya 14%. Mengapa?
[perbarui]
Menambahkan lebih banyak kode
[update2]
Yang paling menarik adalah saya juga menulis server dan klien penerima data sederhana lainnya. Server hanya menerima data dari soket lalu membuangnya. Kedua jenis pengalokasian ruang ini bekerja hampir sama, tidak ada perbedaan besar dalam penggunaan CPU. Dalam aplikasi server multithread yang bermasalah, saya bahkan mereset ukuran tumpukan proses menjadi 30M, menggunakan array masih menimbulkan masalah, tetapi mengalokasikan dari heap menyelesaikannya. Saya tidak tahu kenapa.
Mengenai "sizeof(buffer)", terima kasih telah menunjukkan hal ini, tetapi saya 100% yakin itu bukan masalahnya, karena dalam aplikasi saya, saya tidak menggunakan sizeof(buffer), melainkan ONE_MEGA (1024*1024) .
Ngomong-ngomong, ada satu hal lagi yang perlu disebutkan meski saya tidak yakin itu berguna atau tidak. Mengganti array dengan array yang lebih kecil seperti "char buffer[1024]; juga mengurangi penggunaan CPU secara drastis.
[update3]
Semua soket berada dalam mode non-pemblokiran.
/bin/time
secara konsisten menunjukkan jumlah kesalahan laman yang berbeda untuk kedua versi? - person Useless   schedule 29.07.2013recv
untuk pengujian alokasi dinamis? Jika tidak,sizeof(buffer)
diteruskan kerecv
akan mengatakan bahwa Anda ingin membacasizeof(char*)
(mungkin 4 atau 8 byte) daripada 1Mb - person simonc   schedule 29.07.2013