我必须准备一个必须通过套接字发送的字符串,该字符串使用不同的数据类型int,char,unsigned char等构建...因为我在许多地方使用它,我的callgrind报告说大多数sprintf和strcat消耗的CPU。
有人可以告诉我替代这个sprintf和strcat的想法吗?
以下是一段代码
pData_temp = (char *)malloc(200);
pData = (char *)malloc(500);
sprintf(pData_temp, "String to be sent over socket at time %u $%04x",seconds,id);
strncpy(pData,pData_temp,strlen(pData_temp);
for in t(i=0; i < 1000; i++)
{
sprintf(pData_temp,"%02x%04x%08x%08x%08x",var1,var2,var3,var4,var5);
strcat(pData,pData_temp);
}
sprintf(pData_temp,"\n");
strcat(pData,pData_temp)
sock_send(pData,strlen(pData);
free(pData);
free(pData_temp);
任何有用的帮助。
此致
答案 0 :(得分:3)
您正在使用 Shlemiel the painter's algorithm。
相反,你可以按照你写的长度推进pData
,而不是一遍又一遍strcat
。
sprintf
会返回您需要添加的号码。
但正如@alk在评论中指出的那样,将pData_temp
直接写入套接字可能会更好 - 不要打扰制作一个大字符串。
答案 1 :(得分:2)
代码中有缓冲区溢出。您只为pData分配500个字节,并将1000个30字节的字符串连接到它。
数据真的需要是ASCII吗?您可以使用二进制数据而不是ASCII来提高算法的效率: -
struct Data // turn off padding!
{
char var1;
short var2;
int var3, var4, var5;
};
void somefunc ()
{
int i;
for (i = 0 ; i < 1000 ; ++i)
{
struct Data data;
// set up the members of data
socket_write (&data, sizeof data); // not a real function, pseudo-code!
}
}