Tôi đã thực hiện chức năng này trong C bằng cách sử dụng các cuộc gọi hệ thống (mở, đọc và ghi) để mô phỏng chức năng "mèo" trong hệ thống Linux và nó chậm hơn so với thực tế ...Tại sao chức năng "mèo" của tôi với các cuộc gọi hệ thống chậm hơn so với "con mèo" của Linux?
Tôi đang sử dụng cùng một kích thước bộ đệm là "con mèo" thực sự và sử dụng "strace" Tôi nghĩ rằng nó làm cho cùng một số lượng các cuộc gọi hệ thống. Nhưng đầu ra từ "con mèo" của tôi chậm hơn một chút so với "con mèo" thực sự.
Đây là mã tôi có:
#define BUFSIZ 32768
int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
ssize_t writtenBytes = 0;
while(writtenBytes < readBytes) {
writtenBytes += write(fdout,
buffer + writtenBytes, readBytes - writtenBytes);
if(writtenBytes == -1) {
return -1;
}
}
return 0;
}
int catPrint(int fdin, int fdout) {
char buffer[BUFSIZ];
ssize_t readBytes;
do {
readBytes = read(fdin, buffer, BUFSIZ);
if(readBytes == -1) {
return -1;
}
if(sysWriteBuffer(fdout, buffer, readBytes) == -1) {
return -1;
}
} while(readBytes > 0);
return 0;
}
Tôi đang đọc từ một tập tin (mà tôi vượt qua như là đối số to main, tôi nghĩ rằng mã đó là không cần thiết ở đây) hơn tôi gọi là catPrint() chức năng với bộ mô tả tập tin đó và 1 cho bộ mô tả đầu ra để nó in ra stdout.
Tôi không hiểu tại sao nó chậm hơn vì tôi đang sử dụng cùng một tệp để thử nghiệm và với cả hai (con mèo thật "và của tôi) chỉ có một lần đọc() và một ghi() cho toàn bộ văn bản. Không phải toàn bộ văn bản chỉ xuất hiện trên màn hình sao?
P.S: Tôi đã gắn thẻ bài tập này làm bài tập ở nhà mặc dù câu hỏi của tôi ở đây (tại sao nó chậm hơn) không phải là một phần của bài tập về nhà. Tôi chỉ cần sử dụng các cuộc gọi hệ thống để tạo ra một loại "mèo" loại, được thực hiện. Tôi chỉ bị hấp dẫn bởi mã của tôi hơi chậm hơn một chút.
VẤN ĐỀ giải quyết với sự ngu dốt TỪ ME:
Tôi chỉ quyết định gọi con mèo gốc linux của một vài lần trên cùng một tập tin, một sau khi khác, và tôi chỉ nhận ra rằng nó cũng đã được làm chậm một số lần tôi gọi nó, cũng chậm như của tôi. Tôi đoán mọi thứ đều tốt đẹp hơn ...
Xin lỗi vì đã lãng phí thời gian của bạn như người này.
IMHO, thẻ 'bài tập về nhà' gây hiểu lầm. Câu hỏi của bạn liên quan đến một thực tế cơ bản thú vị. 'bài tập về nhà 'ngụ ý công việc của người mới bắt đầu tẻ nhạt hoặc (ở đầu kia của thang điểm) là một câu hỏi đố vui. –
BTW lỗi (tức là viết trở lại -1) xử lý là không chính xác nếu lỗi xảy ra trên ghi thứ hai(). – jpalecek
Bạn có thể xóa thẻ bài tập về nhà nếu bạn nghĩ nó tốt hơn ... Ý bạn là gì jpalecek? Chỉ có một ghi (như trong cuộc gọi hệ thống) tôi chỉ có một chức năng phụ trợ. Nếu hàm write() bên trong hàm phụ không thành công, tôi cần trả về -1 tất cả các cách để catPrint() được gọi là ... –