關於(C語言)文件讀寫速率問題

寫這篇文章是因爲聽到有人說“C++寫文件速度太慢了”,我們都知道在編程語言裏,彙編的速率>C語言>C++>其他語言,所以C++寫文件的速度不可能會慢的,如果C++寫文件都慢,那除了彙編和C語言的其他語言寫文件豈不是慢的不像話?

言歸正傳,文件讀寫的速率主要還是我們對讀寫操作的操作次數太多了,也就是我們寫的代碼問題,其次是硬件上的問題了,硬件就說了。

爲什麼對讀寫操作的操作次數多了速率會慢呢?這是相對來說的,並不是說操作的越多後面就越慢。我們每調用一次fread()、fwrite()函數,雖然看起來都只是一條語句,但轉成彙編都是先把前面的數據壓棧,保持起來,以便調用完函數之後再出棧恢復原本的數據,也就是每調一次函數都會多出壓棧出棧的操作。我們讀寫文件的時候,有些數據是可以一次性讀寫出來的,並不是一個數據一個數據的讀寫,這些一次性的操作可以減少不少時間。
例如,有一個數組,現要把這個數組的內容寫到文件裏面,有些人就喜歡

	int i = 0;
	int Array[n];
	for(i = 0; i < n; i++)
		fwrite(&Array[i],sizeof(int),1,fp);

這數組越大越能感受的到寫入的時間。但如果把他改成

	int Array[n];
	fwrite(Array,sizeof(int),n,fp);

就能減少隨着n的增大而增加壓棧出棧的次數,減少時間。fread()函數也是一樣的,這也就適用於數據的來源是一片連續的內容,不要刻意的去製造這些,在你刻意的去製造時,無意間已經增加的負擔。

這也是我大學時做的一個實驗,就是寫相同大小的數據,每次調用fwrite()寫入的數據量不同時會怎樣,那時還沒學彙編,就只懂得了一次讀寫的數據越大,消耗的時間就越短。學了彙編後,回想去這些才懂得壓棧出棧的問題(拋開源碼內容來說)。

如有不對地方,歡迎指出,一起探討學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章