<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 4.8 并行測試 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-04/recipe-08 中找到。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 大多數現代計算機都有4個或更多個CPU核芯。CTest有個非常棒的特性,能夠并行運行測試,如果您有多個可用的核。這可以減少測試的總時間,而減少總測試時間才是真正重要的,從而開發人員頻繁地進行測試。本示例中,我們將演示這個特性,并討論如何優化測試以獲得最大的性能。 其他測試可以進行相應地表示,我們把這些測試腳本放在`CMakeLists.txt`同目錄下面的test目錄中。 ## 準備工作 我們假設測試集包含標記為a, b,…,j的測試用例,每一個都有特定的持續時間: | 測試用例 | 該單元的耗時 | | ---------- | ------------ | | a, b, c, d | 0.5 | | e, f, g | 1.5 | | h | 2.5 | | i | 3.5 | | j | 4.5 | 時間單位可以是分鐘,但是為了保持簡單和簡短,我們將使用秒。為簡單起見,我們可以用Python腳本表示`test a`,它消耗0.5個時間單位: ```python import sys import time # wait for 0.5 seconds time.sleep(0.5) # finally report success sys.exit(0) ``` 其他測試同理。我們將把這些腳本放在`CMakeLists.txt`下面,一個名為`test`的目錄中。 ## 具體實施 對于這個示例,我們需要聲明一個測試列表,如下: 1. `CMakeLists.txt`非常簡單: ```cmake # set minimum cmake version cmake_minimum_required(VERSION 3.5 FATAL_ERROR) # project name project(recipe-08 LANGUAGES NONE) # detect python find_package(PythonInterp REQUIRED) # define tests enable_testing() add_test(a ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/a.py) add_test(b ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/b.py) add_test(c ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/c.py) add_test(d ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/d.py) add_test(e ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/e.py) add_test(f ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/f.py) add_test(g ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/g.py) add_test(h ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/h.py) add_test(i ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/i.py) add_test(j ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/j.py) ``` 2. 我們可以配置項目,使用`ctest`運行測試,總共需要17秒: ```shell $ mkdir -p build $ cd build $ cmake .. $ ctest Start 1: a 1/10 Test #1: a ................................ Passed 0.51 sec Start 2: b 2/10 Test #2: b ................................ Passed 0.51 sec Start 3: c 3/10 Test #3: c ................................ Passed 0.51 sec Start 4: d 4/10 Test #4: d ................................ Passed 0.51 sec Start 5: e 5/10 Test #5: e ................................ Passed 1.51 sec Start 6: f 6/10 Test #6: f ................................ Passed 1.51 sec Start 7: g 7/10 Test #7: g ................................ Passed 1.51 sec Start 8: h 8/10 Test #8: h ................................ Passed 2.51 sec Start 9: i 9/10 Test #9: i ................................ Passed 3.51 sec Start 10: j 10/10 Test #10: j ................................ Passed 4.51 sec 100% tests passed, 0 tests failed out of 10 Total Test time (real) = 17.11 sec ``` 3. 現在,如果機器有4個內核可用,我們可以在不到5秒的時間內在4個內核上運行測試集: ```shell $ ctest --parallel 4 Start 10: j Start 9: i Start 8: h Start 5: e 1/10 Test #5: e ................................ Passed 1.51 sec Start 7: g 2/10 Test #8: h ................................ Passed 2.51 sec Start 6: f 3/10 Test #7: g ................................ Passed 1.51 sec Start 3: c 4/10 Test #9: i ................................ Passed 3.63 sec 5/10 Test #3: c ................................ Passed 0.60 sec Start 2: b Start 4: d 6/10 Test #6: f ................................ Passed 1.51 sec 7/10 Test #4: d ................................ Passed 0.59 sec 8/10 Test #2: b ................................ Passed 0.59 sec Start 1: a 9/10 Test #10: j ................................ Passed 4.51 sec 10/10 Test #1: a ................................ Passed 0.51 sec 100% tests passed, 0 tests failed out of 10 Total Test time (real) = 4.74 sec ``` ## 工作原理 可以觀察到,在并行情況下,測試j、i、h和e同時開始。當并行運行時,總測試時間會有顯著的減少。觀察` ctest --parallel 4`的輸出,我們可以看到并行測試運行從最長的測試開始,最后運行最短的測試。從最長的測試開始是一個非常好的策略。這就像打包移動的盒子:從較大的項目開始,然后用較小的項目填補空白。a-j測試在4個核上的疊加比較,從最長的開始,如下圖所示: ```shell --> time core 1: jjjjjjjjj core 2: iiiiiiibd core 3: hhhhhggg core 4: eeefffac ``` 按照定義測試的順序運行,運行結果如下: ```shell --> time core 1: aeeeiiiiiii core 2: bfffjjjjjjjjj core 3: cggg core 4: dhhhhh ``` 按照定義測試的順序運行測試,總的來說需要更多的時間,因為這會讓2個核大部分時間處于空閑狀態(這里的核3和核4)。CMake知道每個測試的時間成本,是因為我們先順序運行了測試,將每個測試的成本數據記錄在`test/Temporary/CTestCostData.txt`文件中: ```shell a 1 0.506776 b 1 0.507882 c 1 0.508175 d 1 0.504618 e 1 1.51006 f 1 1.50975 g 1 1.50648 h 1 2.51032 i 1 3.50475 j 1 4.51111 ``` 如果在配置項目之后立即開始并行測試,它將按照定義測試的順序運行測試,在4個核上的總測試時間明顯會更長。這意味著什么呢?這意味著,我們應該減少的時間成本來安排測試?這是一種決策,但事實證明還有另一種方法,我們可以自己表示每次測試的時間成本: ```cmake add_test(a ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/a.py) add_test(b ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/b.py) add_test(c ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/c.py) add_test(d ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/d.py) set_tests_properties(a b c d PROPERTIES COST 0.5) add_test(e ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/e.py) add_test(f ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/f.py) add_test(g ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/g.py) set_tests_properties(e f g PROPERTIES COST 1.5) add_test(h ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/h.py) set_tests_properties(h PROPERTIES COST 2.5) add_test(i ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/i.py) set_tests_properties(i PROPERTIES COST 3.5) add_test(j ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/j.py) set_tests_properties(j PROPERTIES COST 4.5) ``` 成本參數可以是一個估計值,也可以從`test/Temporary/CTestCostData.txt`中提取。 ## 更多信息 除了使用` ctest --parallel N`,還可以使用環境變量`CTEST_PARALLEL_LEVEL`將其設置為所需的級別。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看