【发布时间】:2016-04-24 18:41:57
【问题描述】:
以下 RPC 程序在 Fedora 上执行非常缓慢。
如果我在llist.x 中将name 缓冲区的大小从999 个字符更改为512 个字符,那么它的工作速度很快。
我不知道为什么。
如果有人知道原因,请告诉我!
注意:请编译以下程序并执行服务器然后客户端。 (对我来说,30 个循环需要 3 秒。)
llist.c
#include "llist.h"
#define PRINT_TIME (!gettimeofday(&tv, NULL) && printf(" %lf",tv.tv_sec+(tv.tv_usec/1000000.0)))
struct timeval tv;
int main(int argc, char *argv[])
{
CLIENT *cl;
int *result,i=0;
cl = clnt_create("localhost", PRINTER, PRINTER_V1, "tcp");
if (cl == NULL) {
clnt_pcreateerror("Cant Create Client Handle");
printf("error: could not connect to server.\n");
return 1;
}
ST1 key[1];
ST1_stuff key_x;
/*key_x.ST1_stuff_val = key;
key_x.ST1_stuff_len = 1;
*/
while(i<30)
{
printf("\n %d -> start - ",i);
PRINT_TIME;
result = sei_conf_test_keys2_1(&key_x,cl);
if (result == NULL) {
printf("error: RPC failed!\n");
return 1;
}
printf("\nresult = %d ",*result);
i++;
printf("\n end - ");
PRINT_TIME;
printf("\n -------------------------------------");
}
return 0;
}
llist_svc_proc.c
#include <stdlib.h>
#include "llist.h"
int result;
int *sei_conf_test_keys2_1_svc(ST1 *lst, struct svc_req *req)
{
result = 0;
return &result;
}
llist.x
struct s1{
char name[999]; /* <===== HERE */
};
typedef struct s1 ST1;
typedef ST1 ST1_stuff[1];
program PRINTER {
version PRINTER_V1 {
int SEI_CONF_TEST_KEYS2(ST1_stuff) = 10;
} = 1;
} = 0x2fffffff;
制作文件
.SUFFIXES:
.SUFFIXES: .c .o
CLNT = llist
SRVR = llist_svc
CFLAGS = -g -Wall
SRVR_OBJ = llist_svc_proc.o llist_xdr.o llist_svc.o
CLNT_OBJ = llist.o llist_xdr.o llist_clnt.o
.c.o:
gcc -c -o $@ $(CFLAGS) $<
default: $(CLNT) $(SRVR)
$(CLNT): $(CLNT_OBJ) llist.h
gcc -o $(CLNT) $(CLNT_OBJ)
$(SRVR): $(SRVR_OBJ) llist.h
gcc -o $(SRVR) $(SRVR_OBJ)
clean:
rm *.o $(CLNT) $(SRVR)
rm -f llist_xdr.c llist.h llist_clnt.c llist_svc.c
rm core
【问题讨论】:
-
你应该在你的makefile中包含
rpcgen命令 -
我在 RHEL6.7 系统
1.19 secs与0.03 secs上看到了相同的时差 -
另外
rm -f core将停止抱怨它不存在。 -
我猜 sendz 和 recvsz 会在 999 自动做一些他们在 512 不会做的坏事。
-
发布的问题包含
llist.c、llist_serv_proc.c、llist.x和makefile。llist.x是什么?llist.h在哪里?