在C 程式碼中,使用最佳化標誌可能會導致語句的潛在重新排序,從而引發對準確性的擔憂執行順序。了解編譯器的最佳化以及它們如何影響語句順序非常重要。
不幸的是,C 缺乏直接強制語句順序的內建機制。考慮到已建立的操作語義以及整數加法等操作不存在可觀察到的影響,編譯器可以在最佳化期間自由地重新排序指令。
對於精確的時序測量,建議使用專門的技術,例如:
考慮以下範例,其目的是測量函數foo 的執行時間:
using Clock = std::chrono::high_resolution_clock; auto t1 = Clock::now(); // Statement 1 auto output = foo(input); // Statement 2 auto t2 = Clock::now(); // Statement 3 auto elapsedTime = t2 - t1;
使用資料箝制技術,可以變更程式碼以確保特定計算保持不變在測量的時間間隔內:
auto input = 42; auto t1 = Clock::now(); // Statement 1 DoNotOptimize(input); auto output = foo(input); // Statement 2 DoNotOptimize(output); auto t2 = Clock::now(); // Statement 3 return t2 - t1;
此處,DoNotOptimize將輸入和輸出資料標記為不可最佳化,從而防止將其刪除或由編譯器重新排序。儘管進行了編譯器最佳化,這仍保證了所需計算的準確計時。
以上是如何保證 C 語言中的語句執行順序以實現準確的時序測量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!