2011-05-07 85 views
19

當字符串<?xml version通過fwrite寫入文件時,隨後的寫入操作變慢。「<?xml version」上的fwrite扼流圈

此代碼:

#include <cstdio> 
#include <ctime> 
#include <iostream> 

int main() 
{ 
    const long index(15000000); 

    clock_t start_time(clock()); 
    FILE* file_stream1 = fopen("test1.txt","wb"); 
    fwrite("<?xml version",1,13,file_stream1); 
    for(auto i = 1;i < index ;++i) 
     fwrite("only 6",1,6,file_stream1); 
    fclose(file_stream1); 

    std::cout << "\nOperation 1 took : " 
     << static_cast<double>(clock() - start_time)/CLOCKS_PER_SEC 
     << " seconds."; 


    start_time = clock(); 
    FILE* file_stream2 = fopen("test2.txt","wb"); 
    fwrite("<?xml versioX",1,13,file_stream2); 
    for(auto i = 1;i < index ;++i) 
     fwrite("only 6",1,6,file_stream2); 
    fclose(file_stream2); 

    std::cout << "\nOperation 2 took : " 
     << static_cast<double>(clock() - start_time)/CLOCKS_PER_SEC 
     << " seconds."; 


    start_time = clock(); 
    FILE* file_stream3 = fopen("test3.txt","w"); 
    const char test_str3[] = "<?xml versioX"; 
    for(auto i = 1;i < index ;++i) 
     fwrite(test_str3,1,13,file_stream3); 
    fclose(file_stream3); 

    std::cout << "\nOperation 3 took : " 
     << static_cast<double>(clock() - start_time)/CLOCKS_PER_SEC 
     << " seconds.\n"; 

    return 0; 
} 

給了我這樣的結果:

Operation 1 took : 3.185 seconds. 
Operation 2 took : 2.025 seconds. 
Operation 3 took : 2.992 seconds. 

也就是說當我們與"<?xml versioX"(操作2)的結果是顯著快替換字符串"<?xml version"(操作1)。第三個操作與第一個操作一樣快,儘管它正在寫更多的字符。

任何人都可以重現嗎?

Windows 7中,32位,MSVC 2010

編輯1

後R ..建議,禁止微軟Security Essentials的恢復正常的行爲。

+9

也許你有反病毒軟件,鉤住了所有的文件操作,並在這一點上踢... – 2011-05-07 23:37:37

+0

您是否嘗試過切換寫入順序?如果僅僅是第一次寫入需要更長時間,我不會感到驚訝。 – 2011-05-07 23:40:00

+1

R ..禁用Microsoft Security Essentials恢復正常行爲。你願意詳細說明併發布答案嗎? – anno 2011-05-07 23:44:22

回答

25

在Windows上,大多數(所有?)防病毒軟件通過掛接到文件讀取和/或寫入操作來運行再次讀取或寫入的數據病毒碼並將其歸類爲安全或病毒。我懷疑你的防病毒軟件,一旦看到一個XML標題,就加載XML惡意軟件病毒模式,並從此開始不斷檢查你正在寫入磁盤的XML是否是已知病毒的一部分。

當然,這種行爲完全沒有意義,它是讓AV程序如此糟糕的聲譽的一部分,因爲勝任的用戶在開啓AV後立即看到他們的表現一落千丈。同樣的目標可以通過其他方式完成,而不會破壞性能。下面是他們應該使用的一些想法:

  • 只有在寫入和讀取之間轉換時才掃描文件一次,而不是在每次寫入之後。即使您確實向磁盤寫入了病毒,它也不會成爲威脅,直到它通過某個過程獲取讀取
  • 一旦文件被掃描,請記住它是安全的,並且不要再次掃描它,直到它被修改。
  • 僅掃描可執行程序或被其他程序檢測爲腳本/程序狀數據的文件。

不幸的是我不知道任何解決方法,直到AV軟件製造商明智,除了把你的AV關閉...這通常是一個壞主意在Windows上。

+0

哇,好趕上。我從來沒有想過這個防病毒行爲的。再說,我不使用防病毒,所以... – Mehrdad 2011-05-07 23:59:44

+0

最(如果不是全部的話)防病毒軟件只能掃描打開或關閉的文件;如果有人真正在單獨讀取或寫入,我會感到驚訝不再掃描文件的問題是,可能沒有現在還沒有定義它;今天它可能是未知的,但明天它可能是壞的。至於只掃描可執行文件,您仍然需要檢查該文件以確定它是否是可執行文件。這些問題都不是不可克服的,但是與所有軟件一樣,都存在一個折衷;在這種情況下,它在性能和安全性之間。 – Luke 2011-05-08 03:35:37

+0

文件已被掃描的緩存標誌只需包含它被掃描的病毒碼的版本號。寫作和閱讀*之間的轉換是我職位的關鍵。只有在寫入後進行第一次讀取時才進行掃描,而不是在所有讀取或全部寫入之後進行掃描,這是確保性能同時保持掃描的全部安全優勢的關鍵。 – 2011-05-08 03:51:55

相關問題