@@ -20,7 +20,7 @@ define(function(require,exports){
20
20
return false ;
21
21
}
22
22
/**
23
- * log函数,只在CPU_DEBUGGER_TURN_ON的时候才log出来
23
+ * log函数,只在cpujs_debugger 或 cpujs.TurnOn.log为true的时候才log出来
24
24
*/
25
25
CPUJS . log = function ( s ) {
26
26
if ( ! CPUJS . TurnOn . Log ) {
@@ -30,6 +30,21 @@ define(function(require,exports){
30
30
window . console . log ( "### CPUJS Log:" + s ) ;
31
31
}
32
32
} ;
33
+ /**
34
+ * mark功能,只在url里附加"cpujs_debugger"启动调试模式才会体现出来
35
+ * 用于在cpu曲线上打出一个标志,方便调试问题
36
+ * @param {String } label 要显示的文字
37
+ * @param {String } color 自定义颜色
38
+ * @param {String } detail Mark 的详细信息
39
+ */
40
+ CPUJS . mark = function ( label , color , detail ) {
41
+ if ( CPUJS . TurnOff . MARK ) {
42
+ return ;
43
+ }
44
+ if ( CPUJS . Monitor . UI && "function" == typeof ( CPUJS . Monitor . UI . drawMark ) ) {
45
+ CPUJS . Monitor . UI . drawMark ( label , color , detail ) ;
46
+ }
47
+ } ;
33
48
/**
34
49
* 优先采用效率更高的Date.now,效率是new Date()3.5倍多
35
50
*/
@@ -39,7 +54,7 @@ define(function(require,exports){
39
54
*/
40
55
CPUJS . Config = {
41
56
TM_MAX_CPU :30 , //设置任务调度器尽量不要超过的CPU阀值
42
- TM_MISSION_DELAY :5
57
+ TM_MISSION_DELAY :5 //设置单次任务执行时间超过多少ms要被log出来
43
58
} ;
44
59
/**
45
60
* CPUJS的开关,用来按需选择打开一些默认不开启的功能
@@ -57,6 +72,7 @@ define(function(require,exports){
57
72
CPUJS . TurnOff = {
58
73
TM :false , //是否关闭任务管理器智能调度
59
74
FastLoad :false , //是否关闭FastLoad
75
+ MARK :false , //是否关闭Mark功能
60
76
EnergySave :false //是否关闭节能功能(按需启动Monitor,当不没有服务的时候就暂停运转)
61
77
} ;
62
78
/**
@@ -71,34 +87,43 @@ define(function(require,exports){
71
87
timerID :null , //定时采集数据的定时器ID
72
88
lastTime :0 , //上一个点的绝对时间
73
89
currentTime :0 , //当前点的绝对时间
74
- isPause :true , //是否被暂停
90
+ isPause :null , //是否被暂停
75
91
/**
76
92
* 初始化
77
93
*/
78
94
init :function ( ) {
95
+ QZONE . console && QZONE . console . log && QZONE . console . log ( 'CPUJS.Monitor.init(): start' ) ; //log
96
+
79
97
var p = CPUJS . Monitor ;
80
98
if ( p . hasInit ) {
99
+ QZONE . console && QZONE . console . log && QZONE . console . log ( 'CPUJS.Monitor.init(): have initialized, return' ) ; //log
81
100
return ;
82
101
}
83
102
p . run ( ) ; //Monitor开始工作
84
103
p . hasInit = true ;
85
104
p . lastTime = CPUJS . now ( ) ;
86
105
if ( CPUJS . TurnOn . Monitor ) { //如果需要UI渲染则拉取UI库
87
- var ui = ( ua && ua . ie < 9 ) ?'./cpu_monitor_ui_vml' :'./cpu_monitor_ui_canvas' ;
88
- require . async ( ui , function ( m ) {
106
+ var ui = ( ua && ua . ie < 9 ) ? './cpu_monitor_ui_vml' : './cpu_monitor_ui_canvas' ;
107
+ require . async ( ui , function ( m ) {
108
+ QZONE . console && QZONE . console . log && QZONE . console . log ( 'CPUJS.Monitor.init(): cpujs UI loaded' ) ; //log
109
+ m . ZOOM = 2 ;
110
+ m . PANEL_WIDTH = document . body . clientWidth / 2 - 50 ;
89
111
CPUJS . Monitor . UI = m ;
112
+ CPUJS . Monitor . UI . bootstrap ( ) ;
90
113
} ) ;
91
114
}
115
+
116
+ QZONE . console && QZONE . console . log && QZONE . console . log ( 'CPUJS.Monitor.init(): end' ) ; //log
92
117
} ,
93
118
/**
94
119
* 在console打印出cpu曲线
95
120
*/
96
121
drawUIByConsole :function ( per ) {
97
- var n = Math . round ( per * 10 ) , s = "▆" ;
98
- for ( var i = n ; i -- ; ) {
99
- s += "▆" ;
122
+ var n = Math . round ( per * 10 ) , s = "▆" ;
123
+ for ( var i = n ; i -- ; ) {
124
+ s += "▆" ;
100
125
}
101
- s += Math . round ( per * 100 ) ;
126
+ s += Math . round ( per * 100 ) ;
102
127
CPUJS . log ( s ) ;
103
128
} ,
104
129
/**
@@ -155,7 +180,7 @@ define(function(require,exports){
155
180
*/
156
181
resume :function ( ) {
157
182
var p = CPUJS . Monitor ;
158
- if ( ! p . isPause ) {
183
+ if ( p . isPause != null && ! p . isPause ) {
159
184
return ;
160
185
}
161
186
//避免长时间的暂停跟真正的卡住搞混,所以每次重启的时候都加上一个0的数值。
@@ -502,9 +527,10 @@ define(function(require,exports){
502
527
//动态调整单任务cpu参数
503
528
//更大程度利用cpu资源
504
529
var freePer = ( p . getMaxCPU ( ) / 100 ) - per , c ; //剩余资源
505
- if ( freePer > 0 ) {
530
+ if ( freePer > 0 && ! p . Shooter . lock ) {
506
531
c = p . GearBox . getNum ( ) ; //获取可以同时执行的任务数
507
- CPUJS . log ( "do missions count:" + c ) ;
532
+ //CPUJS.log("do missions count:"+c);
533
+ p . Shooter . lock = true ;
508
534
p . Shooter . exec ( c ) ;
509
535
}
510
536
//如果当前已经没有空余CPU资源了,则本次啥都不做,继续检测
@@ -608,11 +634,56 @@ define(function(require,exports){
608
634
* 负责任务处理的模块
609
635
*/
610
636
Shooter :{
637
+ exec1 :function ( count ) {
638
+ var p = CPUJS . TM , fn , a , len , d1 , d2 , t1 , t2 , t3 , _a = [ ] , d = 0 , d0 = CPUJS . now ( ) ;
639
+ //a = p.Loader.getTask(count);//获取数量为count的一批任务
640
+ while ( d < CPUJS . Config . TM_MAX_CPU ) {
641
+ console . log ( "ddddd:" + d + " CPUJS.Config.TM_MAX_CPU:" + CPUJS . Config . TM_MAX_CPU ) ;
642
+ a = p . Loader . getTask ( 1 ) ;
643
+ fn = a . shift ( ) ;
644
+ if ( isArray ( fn ) ) {
645
+ _a = fn [ 1 ] ;
646
+ fn = fn [ 0 ] ;
647
+ }
648
+ if ( "function" == typeof ( fn ) ) {
649
+
650
+ /*
651
+ (function(ar){//这里不使用setTimeout的主要原因是要让几个任务同步执行,才能让cpu曲线即时有变化,才可以更好的做下一步的智能调度决策
652
+ setTimeout(function(){
653
+ fn.apply(null,ar);
654
+ window.__c++;
655
+ console.log(window.__c);
656
+ },10);
657
+ })(_a);
658
+ */
659
+ if ( ! CPUJS . TurnOn . TryCatch ) { //调试模式下不走try catch
660
+ fn . apply ( null , _a ) ;
661
+ } else {
662
+ try { //try catch如果没捕捉到出错其实基本上没开销;捕捉1000次有出错的才15ms开销
663
+ fn . apply ( null , _a ) ;
664
+ } catch ( e ) {
665
+ CPUJS . log ( e ) ;
666
+ }
667
+ }
668
+ t2 = CPUJS . now ( ) ;
669
+
670
+ if ( t3 > CPUJS . Config . TM_MISSION_DELAY ) {
671
+ p . Stat . log ( fn . toString ( ) , t3 ) ; //记录这个任务的执行时间
672
+ }
673
+ d = t2 - d0 ;
674
+ continue ;
675
+ }
676
+ d += 30 ;
677
+ }
678
+ setTimeout ( function ( ) {
679
+ CPUJS . TM . Shooter . lock = false ;
680
+ } , 50 ) ;
681
+ } ,
611
682
exec :function ( count ) {
612
683
var p = CPUJS . TM , fn , a , len , d1 , d2 , t1 , t2 , t3 , _a = [ ] ;
613
684
a = p . Loader . getTask ( count ) ; //获取数量为count的一批任务
614
685
len = a . length ;
615
- var d1 = CPUJS . now ( ) ;
686
+ d1 = CPUJS . now ( ) ;
616
687
while ( a . length > 0 ) { //优先执行fastQueue里面的关键任务
617
688
fn = a . shift ( ) ;
618
689
if ( isArray ( fn ) ) {
@@ -653,6 +724,9 @@ define(function(require,exports){
653
724
cpuPer = Math . max ( cpuPer , per ) ;
654
725
CPUJS . TM . GearBox . adjust ( cpuPer ) ;
655
726
} ) ;
727
+ setTimeout ( function ( ) {
728
+ CPUJS . TM . Shooter . lock = false ;
729
+ } , 5 ) ;
656
730
}
657
731
} ,
658
732
//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv任务处理部分vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
@@ -678,6 +752,7 @@ define(function(require,exports){
678
752
while ( p . queue . length > 0 ) { //优先执行fastQueue里面的关键任务
679
753
o = p . queue . shift ( ) ;
680
754
_a . push ( "fn:" + o . fn + " time:" + o . time ) ;
755
+ CPUJS . mark ( o . time , "#F00" , "time:" + o . time + "\n\nfn:" + o . fn ) ;
681
756
}
682
757
CPUJS . log ( _a . join ( "\n" ) ) ;
683
758
}
@@ -831,11 +906,13 @@ define(function(require,exports){
831
906
exports . Stat = CPUJS . Monitor . Stat ;
832
907
exports . TurnOn = CPUJS . TurnOn ;
833
908
exports . TurnOff = CPUJS . TurnOff ;
909
+ exports . mark = CPUJS . mark ;
834
910
/**
835
911
* 环境配置
836
912
*/
837
913
CPUJS . setup = function ( ) {
838
- var pre = "cpujs_" , url = location . href . toLowerCase ( ) , k ;
914
+ var pre = "cpujs_" , url = location . href . toLowerCase ( ) , k ;
915
+
839
916
if ( location . href . indexOf ( "cpujs_debugger" ) > - 1 ) {
840
917
CPUJS . TurnOn . Log = true ;
841
918
CPUJS . TurnOn . Monitor = true ;
0 commit comments