业务上,C++编写的进程A和GO编写的进程B,需要在同一设备内通信。为此测试不同通信方式的性能。
在这个实验里,测试用socket实现进程间通信的性能,读写都使用单线程。
1. C++程序写数据 (cSock.cpp)
#include <iostream>
#include <string>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SEND_TIMES 1000000
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
std::string hello = "01234567890123456789012345678901";
// 创建socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
return 1;
}
// 配置SO_REUSEADDR选项
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
perror("setsockopt failed");
return 1;
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
// 绑定套接字到地址和端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
return 1;
}
// 监听连接
if (listen(server_fd, 3) < 0) {
perror("listen failed");
return 1;
}
// 接受连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
return 1;
}
// 发送数据
for(int i = 0; i < SEND_TIMES; i++) {
send(new_socket, hello.c_str(), hello.length(), 0);
}
// 等待2秒后关闭连接
sleep(2);
close(new_socket);
return 0;
}
2. GO程序读数据 (gSock.go)
package main
import (
"fmt"
"net"
"time"
)
func main() {
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
fmt.Println("Error connecting:", err)
return
}
defer conn.Close()
t1 := time.Now().UnixNano()
buffer := make([]byte, 1024)
for {
n, err := conn.Read(buffer)
if err != nil {
if err.Error() == "EOF" {
break // 读取到EOF时退出循环
}
fmt.Println("Error reading:", err)
return
}
if n == 0 {
fmt.Println("Connection closed by client")
break
}
_ = string(buffer[:n])
}
t2 := (time.Now().UnixNano() - t1) / 1000000
fmt.Printf("单线程所用时长:%d ms\n", t2)
}
3. 实验结果
实验环境:Intel(R) Xeon(R) Gold 6161 CPU @ 2.20GHz
实验数据如下表,最终结果取十次测试的平均值。
可以看出,用socket通信的时间 (3504.8ms)比用命名管道 (2805.5ms) 要高一些。
命名管道实验参考:进程间通信—命名管道-CSDN博客
读(go)-写(c++) 线程数 | 建立的socket连接数 | 读写数据量 | 每次实验时长(ms) | 平均时长 (ms) |
1-1 | 1 | 32MB | 3653 3374 3410 3418 3589 3342 3806 3360 3502 3694 | 3504.8 |