12 結果記錄與分析
12.1 結果紀錄 (Result Recording)
OMNeT++ 內建輸出向量(output vectors)與輸出純量(output scalars)來記錄模擬結果。output vectors是一個時間序列資料,紀錄來自於簡單模組或是通道的資料,你可以使用output vector來記錄端點到端點間的延遲(end-to-end delay)或是封包的來回傳遞時間(round trip times)、排隊時間(queueing times)、模組狀態、連線的使用效率、封包丟棄等任何在模擬過程中發生的事件,並用來分析以得知系統的全貌。
Output scalars用來儲存計數總和的數值,在模擬過程中加總計算然後在模擬結束時寫入紀錄。純量結果可以是整數或是實數,亦或是一個由數個數值計算後的統計結果,例如計數值、平均值、標準差、和、最小值、以及最大值等等,也可以紀錄長條統計圖表數值(histogram data)。
模擬結果可以使用兩種方式收集與紀錄:
- 基於控制訊號機制,使用宣告的統計值。
- 使用模擬函式庫,使用C++語言紀錄。
第二種方式是傳統使用紀錄資料的方式,而第一種方式是由OMNeT++ 4.1版以後支援的方法,因為它可以在任何時候記錄你想要的資料且不需要重新修改模擬模型,是比較推薦使用的方法。
12.1.1 使用控制訊息與宣告統計 (Using Signals and Declared Statistics)
這個方式使用控制訊息機制(see [4.14])與NED屬性(see [3.12])來將模擬結果的產生與它的紀錄過程分離,因此可以提供更多的彈性來產生紀錄的形式。關於這個解決方案的細節已經在[4.15]節中介紹,這裡我們給予一點簡單的複習。
統計值在NED語言中使用@statistic屬性註解,同時模組使用控制訊息機制將結果送出。模擬基礎架構藉由特殊的結果檔案寫入器來監聽這些被送出的訊號並紀錄資料。藉由選取需要監聽的資料,使用者可以控制那些資料將會被記錄在檔案中,那些資料在記錄前需要經過特別的計算等。在前面的[4.15]節中也解釋了如何使用指令控制簡單模組與通道來處理以控制訊號為基礎的結果紀錄(signals-based result recording)方法。
這個方法同時也允許彙整與計算統計資料,例如計算在網路中被丟棄的封包數量,也可以不需要撰寫專程的程式碼就可以實現網路模擬的暖機過程以排除統計上的暫態現象;它也允許你不用修改現有的模擬模組的情況下撰寫專程的統計值收集模組。
相同的組態選項,像是那些我們用來控制結果紀錄的cOutVector與recordScalar()函式,也能在這個以控制訊號為基礎的結果紀錄方法中被利用。它也擁有額外的組態選項去提供其他存取的可能性。
12.1.2 直接結果紀錄 (Direct Result Recording)
這個方式中,純量和統計值結果以模組中類別變數的方式收集,並且在模擬結束的階段使用recordScalar()函式呼叫來記錄變數的數值。向量(vectors)使用cOutVector物件來記錄。如果要記錄更詳細的資料,例如最小/最大值或是標準差,cStdDev、cWeightedStdDev等物件可以利用;要記錄長條統計圖分布與其它的統計估計值可以使用cDoubleHistogram、cLongHistogram、cPSquare、cKSplit、與其他等類別。這些統計類別在[7.8]和[7.9]節中已經有描述過。個別的向量、純量、以及統計值可以在組態設定檔(.ini)中啟用或停用紀錄,同時也可以在組態設定檔中設定向量紀錄的時間間隔值。
使用直接結果紀錄的方式的缺點是它需要將統計程式碼直接寫死在模組中,如果我們需要改變一些統計資料內容,例如將紀錄系統的封包平均延遲時間更改成紀錄每一筆封包的延遲時間,都需要修改或是增加模組的資料收集程式碼。
12.2 結果收集設定 (Configuring Result Collection)
12.2.1 以控制訊號為基礎的統計值紀錄設定 (Configuring Signal-Based Statistics Recording)
以控制訊號為基礎的統計值紀錄在設計的時候已經考慮了容易設定想要收集資訊的方式。
(未完成)