2
2
3
3
extern crate rand;
4
4
extern crate chrono;
5
+ extern crate num_cpus;
5
6
extern crate tesla;
6
7
extern crate trex;
7
8
@@ -10,8 +11,8 @@ use rand::Rng;
10
11
use std:: sync:: Arc ;
11
12
use std:: sync:: mpsc:: sync_channel;
12
13
use std:: thread;
13
- use tesla:: { AttributeDeclaration , Engine , Event , EventTemplate , Listener , Rule , Tuple ,
14
- TupleDeclaration , TupleType } ;
14
+ use tesla:: { AttributeDeclaration , Engine , Event , EventTemplate , Listener , Rule , SubscrFilter ,
15
+ Tuple , TupleDeclaration , TupleType } ;
15
16
use tesla:: expressions:: * ;
16
17
use tesla:: predicates:: * ;
17
18
use trex:: * ;
@@ -61,11 +62,11 @@ fn generate_length_rules<R: Rng>(rng: &mut R, cfg: &Config) -> Vec<Rule> {
61
62
let mut rules = Vec :: new ( ) ;
62
63
for i in 0 ..cfg. num_rules {
63
64
let id = i % cfg. num_def + 1 ;
64
- let constraint = Arc :: new ( Expression :: BinaryOperation {
65
+ let constraint = Expression :: BinaryOperation {
65
66
operator : BinaryOperator :: Equal ,
66
67
left : Box :: new ( Expression :: Reference { attribute : 0 } ) ,
67
68
right : Box :: new ( Expression :: Immediate { value : 1 . into ( ) } ) ,
68
- } ) ;
69
+ } ;
69
70
let root_pred = Predicate {
70
71
ty : PredicateType :: Trigger { parameters : Vec :: new ( ) } ,
71
72
tuple : ConstrainedTuple {
@@ -170,14 +171,19 @@ fn execute_bench_length(cfg: &Config) {
170
171
let evts = generate_length_events ( & mut rng, & cfg) ;
171
172
172
173
let providers: Vec < Box < NodeProvider > > = vec ! [ Box :: new( StackProvider ) ] ;
173
- let mut engine = TRex :: new ( 4 , providers) ;
174
+ let mut engine = TRex :: new ( num_cpus :: get ( ) , providers) ;
174
175
for decl in decls {
175
176
engine. declare ( decl) ;
176
177
}
177
178
for rule in rules {
178
179
engine. define ( rule) ;
179
180
}
180
181
// engine.subscribe(Box::new(DebugListener));
182
+ engine. subscribe ( SubscrFilter :: Any ,
183
+ Box :: new ( CountListener {
184
+ count : 0 ,
185
+ duration : cfg. num_events / cfg. evts_per_sec ,
186
+ } ) ) ;
181
187
182
188
let start = UTC :: now ( ) ;
183
189
@@ -205,8 +211,8 @@ fn execute_bench_length(cfg: &Config) {
205
211
206
212
fn main ( ) {
207
213
let mut cfg = Config {
208
- num_rules : 1000 ,
209
- num_def : 100 ,
214
+ num_rules : 650 ,
215
+ num_def : 65 ,
210
216
num_pred : 3 ,
211
217
num_events : 40_000 ,
212
218
each_prob : 1.0 ,
@@ -218,18 +224,20 @@ fn main() {
218
224
evts_per_sec : 10000 ,
219
225
} ;
220
226
221
- let frequencies = ( 4000 ...10_000 ) . step_by ( 2000 ) ;
222
- let windows = ( 2 ...10 ) . step_by ( 4 ) ;
223
-
224
- println ! ( "" ) ;
225
- for freq in frequencies {
226
- cfg. evts_per_sec = freq;
227
- println ! ( "- Frequency: {:5} evt/sec" , freq) ;
228
- for avg_win in windows. clone ( ) {
229
- cfg. max_win = Duration :: seconds ( avg_win + 1 as i64 ) ;
230
- cfg. min_win = Duration :: seconds ( avg_win - 1 as i64 ) ;
231
- print ! ( " > Avg Window: {:2}s => " , avg_win) ;
232
- execute_bench_length ( & cfg) ;
227
+ for queue_bound in vec ! [ true , false ] {
228
+ println ! ( "" ) ;
229
+ for freq in vec ! [ 600usize , 800 , 1000 , 1500 , 2500 , 4000 ] {
230
+ cfg. num_events = freq * 60 ;
231
+ cfg. queue_len = if queue_bound { freq / 10 } else { cfg. num_events + 1 } ;
232
+ cfg. evts_per_sec = freq;
233
+ println ! ( "" ) ;
234
+ println ! ( "- Frequency: {:5} evt/sec | Queue len: {:5}" , freq, cfg. queue_len) ;
235
+ for avg_win in ( 2 ...10 ) . step_by ( 4 ) {
236
+ cfg. max_win = Duration :: seconds ( avg_win + 1 as i64 ) ;
237
+ cfg. min_win = Duration :: seconds ( avg_win - 1 as i64 ) ;
238
+ print ! ( " > Avg Window: {:2}s => " , avg_win) ;
239
+ execute_bench_length ( & cfg) ;
240
+ }
233
241
}
234
242
}
235
243
}
0 commit comments