2017-10-16 99 views
-1

我想寫一些文本到一個文件,使用ofstream方法,但當我檢查執行時間,我可以看到,如果該文件不存在,我的程序運行(平均)7秒,當文件存在,它在20秒內運行。以更快的方式覆蓋?

我也嘗試刪除並重新創建文件,如果它存在。這需要7秒鐘,我正在尋找。

在這裏我的問題是關於最快的方式,以便每當我重新運行代碼時,平均時間將再次約7秒,而不首先刪除文件?額外的時間覆蓋文件的原因是什麼?

下面的代碼是我用來創建文件流:

// remove("mytextfile.txt"); 
writer.open("mytextfile.txt", ofstream::out); 

我編我的代碼是這樣的:

g++ -std=c++11 -pthread main.cpp -O3 

(我的程序只在一個線程中運行)

+2

你能提供有關你在做什麼一些更多的信息,像你使用的是什麼操作系統和最小的代碼示例,這將讓我們重現錯誤? – templatetypedef

+0

首先,沒有錯誤(如果我正確地得到了你)。我正在Ubuntu 16.04中編譯和運行我的代碼。我正在做的唯一事情是在文件中寫入2.5 GB的字符(並且我的代碼中有50兆字節的緩衝區,以獲得更快的結果) – Behnam

+0

@templatetypedef這不是一個真正的錯誤 - 更多的是關於代碼行爲。你的評論真的不相關。 –

回答

0

從我的推測,最快的方法是做一個單獨的刪除和覆蓋操作。這是由於兩個原因:

  1. 截斷文件(覆蓋)和創建新文件的工作方式非常不同。創建新文件時,應用程序只是爲文件分配一個新塊。截斷時,它必須首先執行fseek到文件末尾,然後寫入新塊。 (source

  2. C++在完成磁盤操作之前等待文件描述符關閉。如果在文件頂部觸發文件刪除操作,則實際的塊級操作將與您的代碼異步操作,然後執行新的寫操作。如果使用截斷,應用程序必須等待文件在寫入之前被覆蓋,這是一個阻塞操作。 (source