2012-10-26 21 views
1

我解決在其中指出,如何處理在C大投入

這個問題的目的是爲了驗證你是 使用讀取輸入數據的方法是否足夠快,一個網站一個實踐問題以處理標有巨大輸入/輸出警告的問題 。預計您將在運行時每秒處理至少2.5MB的輸入數據,其中 即可。

另外我該如何優化printf和scanf以外的輸入/輸出例程?

+1

要讀取那麼多的數據,只需使用一些大小的塊,例如'fread'。見http://en.cppreference.com/w/c/io/fread – Dan

+0

對不起,但我是一個新手,無法得到它你可以請指導我或有點解釋 –

+1

2.5MB每秒是不是很令人印象深刻如果您使用的是標準桌面硬件......如果這是數據處理(而不是輸入)的速度限制,那麼即使帶有緩存的「fread」的未優化的I/O也可以處理該數據。在這種情況下,投入肯定不會成爲瓶頸。 – paddy

回答

2

它是操作系統特定的(因爲C標準只知道約<stdio.h>)。對於Linux,考慮使用低級系統調用來提高效率,如open(2),mmap(2),read(2),pread(2),write(2)。您可能還想使用readahead(2)。不要忘記在相當大的塊(例如128K字節)中進行I/O,如果可能的話,頁面對齊。閱讀Advanced Linux Programming書。

如果僅限於標準C99功能,請在相當大的塊上使用fread(3)。考慮還增加內部緩衝區setvbuf(3)

而2.5Mbyte /秒並不是很令人印象深刻。可能的瓶頸是硬件,但你應該能夠在標準桌面硬件上獲得20或50Mbps的速度。使用SSD將有很大幫助。

+0

是的,具有分頁大小(或略小於)的頁緩存I/O,也是磁盤扇區大小的倍數的頁對齊塊是速度的祕訣。您必須通過有效處理這些數據來使其值得。 – paddy

+0

我是新來c編程,並不知道太多,所以無法獲得所有技術術語 –

+0

嘗試編碼的東西。如果在Linux上,使用'gcc -Wall -g'編譯它。用調試器(例如'gdb')調試它。運行它,並在大型(兆字節大小)的文件上進行測試。 –