引數:
如下圖所示,每個時間點都會歸屬於乙個時間視窗,即會將時間軸按照時間窗寬度windowlength
進行劃分。每個時間窗都有乙個起始時間starttime
。
獲取某個時間的統計量
更新某個時間的統計量
上面的圖示是在整個時間軸上進行劃分的,有無窮多個時間窗。但是在具體實現上是不可能表示出無窮個時間窗的,所以實現時會使用乙個固定大小的時間窗陣列。採用復用/迴圈儲存時間窗的方式。依據:在某個時間點只需要統計某幾個時間窗的資料即可,而不需要知道所有時間窗的資料,所以只儲存需要的幾個時間窗
此時多了乙個引數samplecount
,陣列的大小就是samplecount
。
關係:samplecount
=intervallength / windowlength
更新某個時間點處的統計量:
獲取某個時間點的統計量
主要的幾個類:
幾個類之間的關係:
需要統計的量在metricevent這個列舉變數表示
public
enum metricevent
典型用法:
// 建立例項,兩個值:2-samplecount 1000-統計的區間大小
arraymetric =
newarraymtric(2
,1000);
// 增加某個統計量的值
arraymetric.
add***
(n);
// 獲取某個統計量的值
arraymetric.
***(
)
當要使用時間窗進行統計時,對外提供的就是arraymetric
。它隱藏了具體的時間窗的實現。
它有乙個成員變數:data=leaparray
即底層的時間窗實現類。
在某個時間點需要增加某個統計量的值,就呼叫add***
型別的api
在某個時間點需要獲取某個統計量的值,就呼叫***()
型別的api
主要分析兩個操作:
首先是時間窗輪轉陣列leaparray
,它是整個時間窗元件的主類。
public
abstract
class
leaparray
}
2.3.1 更新當前時間點某個統計量
呼叫arraymetric
的add***()
方法,這裡以addpass()
為例。
public
void
addpass
(int count)
leaparray
的currentwindow()
方法,此方法很重要會更新陣列各個位置的時間窗為最新的時間窗,更新即重置時間窗的起始時間以及將裡面的統計量進行歸零。
public windowwrap
currentwindow()
public windowwrap
currentwindow
(long timemillis)
// 計算當前時間對應的時間窗在陣列中的位置:
////private int calculatetimeidx(/*@valid*/ long timemillis)
int idx =
calculatetimeidx
(timemillis)
;// calculate current bucket start time.
// 計算時間窗的起始時間
// protected long calculatewindowstart(/*@valid*/ long timemillis)
long windowstart =
calculatewindowstart
(timemillis)
;while
(true
)else
// 如果時間窗的起始時間與當前時間所屬時間窗的起始時間相等,那麼就直接返回此時間窗
}else
if(windowstart == old.
windowstart()
)else
if(windowstart > old.
windowstart()
)finally
}else
}else
if(windowstart < old.
windowstart())}}
2.3.2 獲取某個統計值
呼叫arraymetric的***()方法
public
long
pass()
return pass;
}
leaparray
的values()
方法
public list
values()
public list
values
(long timemillis)
int size = array.
length()
;// 初始化
list
result =
newarraylist
(size)
;// 遍歷時間窗陣列,獲取每乙個元素
for(
int i =
0; i < size; i++
)// 在這裡真正的加入值
result.
add(windowwrap.
value()
);}return result;
}關鍵點:
public
boolean
iswindowdeprecated
(long time, windowwrap
windowwrap)
我對建立時間和保持時間的理解
這篇文章主要是談談我對建立時間和保持時間的理解,文中前四張是引用特權同學 fpga實戰演練邏輯篇51 建立時間和保持時間 出處 中國電子技術論壇 一書。我將以這四張及其延伸為例,進行推導。先說一下建立時間和保持時間的定義。定義都是一致,無異議的,即 建立時間 tsu 是指在時鐘上公升沿到來之前資料必...
matlab窗函式的頻譜 如何理解頻譜洩露?
這只是我個人的理解,錯誤之處還請指正。如果原始訊號中有頻率成分處於兩個基本函式的頻率之間,會怎麼樣呢?fig.1 a 解釋了答案,原始訊號包含兩路不同頻率的正弦波,一路頻率與基本函式匹配,一路頻率不匹配。前者用乙個點就能表示峰值,而後者則會出現乙個峰值伴隨著兩個尾巴的頻譜,即發生了譜洩露 拖尾 可以...
我理解的遞迴
1.在遞迴呼叫工作棧建立之後,各層遞迴所涉及到的變數都已經壓入到棧中,每次呼叫一次函式,系統記憶體機制就會以棧的方式分配該遞迴函式所需的記憶體空間,同時,每層函式得出的結果會暫時儲存在這個棧的空間中 2.當整個遞迴函式在遇到已if 為標誌的條件結束標誌的時候,函式不需要繼續執行該函式,系統停止記憶體...