Skip to content
This repository was archived by the owner on Apr 20, 2018. It is now read-only.

Commit fcedc06

Browse files
perf improvements for creation ops
1 parent f460a08 commit fcedc06

34 files changed

Lines changed: 1482 additions & 386 deletions

Gruntfile.js

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -77,19 +77,19 @@ module.exports = function (grunt) {
7777
'src/core/perf/operators/toarray.js',
7878
'src/core/linq/observable/create.js',
7979
'src/core/linq/observable/defer.js',
80-
'src/core/linq/observable/empty.js',
80+
'src/core/perf/operators/empty.js',
8181
'src/core/perf/operators/from.js',
8282
'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',
8383
'src/core/linq/observable/generate.js',
8484
'src/core/perf/operators/of.js',
8585
'src/core/linq/observable/ofarraychanges.js',
8686
'src/core/linq/observable/ofobjectchanges.js',
87-
'src/core/linq/observable/never.js',
88-
'src/core/linq/observable/pairs.js',
87+
'src/core/perf/operators/never.js',
88+
'src/core/perf/operators/pairs.js',
8989
'src/core/perf/operators/range.js',
9090
'src/core/linq/observable/repeat.js',
91-
'src/core/linq/observable/return.js',
92-
'src/core/linq/observable/throw.js',
91+
'src/core/perf/operators/just.js',
92+
'src/core/perf/operators/throw.js',
9393
'src/core/linq/observable/using.js',
9494

9595
// Multiple
@@ -372,17 +372,17 @@ module.exports = function (grunt) {
372372
'src/core/perf/operators/toarray.js',
373373
'src/core/linq/observable/create.js',
374374
'src/core/linq/observable/defer.js',
375-
'src/core/linq/observable/empty.js',
375+
'src/core/perf/operators/empty.js',
376376
'src/core/perf/operators/from.js',
377377
'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',
378378
'src/core/linq/observable/generate.js',
379379
'src/core/perf/operators/of.js',
380-
'src/core/linq/observable/never.js',
381-
'src/core/linq/observable/pairs.js',
380+
'src/core/perf/operators/never.js',
381+
'src/core/perf/operators/pairs.js',
382382
'src/core/perf/operators/range.js',
383383
'src/core/linq/observable/repeat.js',
384-
'src/core/linq/observable/return.js',
385-
'src/core/linq/observable/throw.js',
384+
'src/core/perf/operators/just.js',
385+
'src/core/perf/operators/throw.js',
386386
'src/core/linq/observable/using.js',
387387

388388
// Multiple
@@ -665,17 +665,17 @@ module.exports = function (grunt) {
665665
'src/core/perf/operators/toarray.js',
666666
'src/core/linq/observable/create.js',
667667
'src/core/linq/observable/defer.js',
668-
'src/core/linq/observable/empty.js',
668+
'src/core/perf/operators/empty.js',
669669
'src/core/perf/operators/from.js',
670670
'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',
671671
'src/core/linq/observable/generate.js',
672-
'src/core/linq/observable/never.js',
672+
'src/core/perf/operators/never.js',
673673
'src/core/perf/operators/of.js',
674-
'src/core/linq/observable/pairs.js',
674+
'src/core/perf/operators/pairs.js',
675675
'src/core/perf/operators/range.js',
676676
'src/core/linq/observable/repeat.js',
677-
'src/core/linq/observable/return.js',
678-
'src/core/linq/observable/throw.js',
677+
'src/core/perf/operators/just.js',
678+
'src/core/perf/operators/throw.js',
679679
'src/core/linq/observable/using.js',
680680

681681
// Multiple
@@ -814,17 +814,17 @@ module.exports = function (grunt) {
814814
'src/core/perf/operators/toarray.js',
815815
'src/core/linq/observable/create.js',
816816
'src/core/linq/observable/defer.js',
817-
'src/core/linq/observable/empty.js',
817+
'src/core/perf/operators/empty.js',
818818
'src/core/perf/operators/from.js',
819819
'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',
820820
'src/core/linq/observable/generate.js',
821-
'src/core/linq/observable/never.js',
821+
'src/core/perf/operators/never.js',
822822
'src/core/perf/operators/of.js',
823-
'src/core/linq/observable/pairs.js',
823+
'src/core/perf/operators/pairs.js',
824824
'src/core/perf/operators/range.js',
825825
'src/core/linq/observable/repeat.js',
826-
'src/core/linq/observable/return.js',
827-
'src/core/linq/observable/throw.js',
826+
'src/core/perf/operators/just.js',
827+
'src/core/perf/operators/throw.js',
828828
'src/core/linq/observable/using.js',
829829

830830
// Multiple
@@ -951,16 +951,16 @@ module.exports = function (grunt) {
951951
'src/core/perf/operators/toarray.js',
952952
'src/core/linq/observable/create.js',
953953
'src/core/linq/observable/defer.js',
954-
'src/core/linq/observable/empty.js',
954+
'src/core/perf/operators/empty.js',
955955
'src/core/perf/operators/from.js',
956956
'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',
957-
'src/core/linq/observable/never.js',
957+
'src/core/perf/operators/never.js',
958958
'src/core/perf/operators/of.js',
959-
'src/core/linq/observable/pairs.js',
959+
'src/core/perf/operators/pairs.js',
960960
'src/core/perf/operators/range.js',
961961
'src/core/linq/observable/repeat.js',
962-
'src/core/linq/observable/return.js',
963-
'src/core/linq/observable/throw.js',
962+
'src/core/perf/operators/just.js',
963+
'src/core/perf/operators/throw.js',
964964

965965
// Multiple
966966
'src/core/linq/observable/catchproto.js',
@@ -1121,16 +1121,16 @@ module.exports = function (grunt) {
11211121
'src/core/perf/operators/toarray.js',
11221122
'src/core/linq/observable/create.js',
11231123
'src/core/linq/observable/defer.js',
1124-
'src/core/linq/observable/empty.js',
1124+
'src/core/perf/operators/empty.js',
11251125
'src/core/perf/operators/from.js',
11261126
'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',
1127-
'src/core/linq/observable/never.js',
1127+
'src/core/perf/operators/never.js',
11281128
'src/core/perf/operators/of.js',
1129-
'src/core/linq/observable/pairs.js',
1129+
'src/core/perf/operators/pairs.js',
11301130
'src/core/perf/operators/range.js',
11311131
'src/core/linq/observable/repeat.js',
1132-
'src/core/linq/observable/return.js',
1133-
'src/core/linq/observable/throw.js',
1132+
'src/core/perf/operators/just.js',
1133+
'src/core/perf/operators/throw.js',
11341134

11351135
// Multiple
11361136
'src/core/linq/observable/catchproto.js',

dist/rx.all.compat.js

Lines changed: 147 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2588,6 +2588,34 @@
25882588
});
25892589
};
25902590

2591+
var EmptyObservable = (function(__super__) {
2592+
inherits(EmptyObservable, __super__);
2593+
function EmptyObservable(scheduler) {
2594+
this.scheduler = scheduler;
2595+
__super__.call(this);
2596+
}
2597+
2598+
EmptyObservable.prototype.subscribeCore = function (observer) {
2599+
var sink = new EmptySink(observer, this);
2600+
return sink.run();
2601+
};
2602+
2603+
function EmptySink(observer, parent) {
2604+
this.observer = observer;
2605+
this.parent = parent;
2606+
}
2607+
2608+
function scheduleItem(s, state) {
2609+
state.onCompleted();
2610+
}
2611+
2612+
EmptySink.prototype.run = function () {
2613+
return this.parent.scheduler.scheduleWithState(this.observer, scheduleItem);
2614+
};
2615+
2616+
return EmptyObservable;
2617+
}(ObservableBase));
2618+
25912619
/**
25922620
* Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.
25932621
*
@@ -2599,11 +2627,7 @@
25992627
*/
26002628
var observableEmpty = Observable.empty = function (scheduler) {
26012629
isScheduler(scheduler) || (scheduler = immediateScheduler);
2602-
return new AnonymousObservable(function (observer) {
2603-
return scheduler.scheduleWithState(null, function () {
2604-
observer.onCompleted();
2605-
});
2606-
});
2630+
return new EmptyObservable(scheduler);
26072631
};
26082632

26092633
var FromObservable = (function(__super__) {
@@ -2883,14 +2907,62 @@
28832907
return new FromArrayObservable(args, scheduler);
28842908
};
28852909

2910+
var NeverObservable = (function(__super__) {
2911+
inherits(NeverObservable, __super__);
2912+
function NeverObservable() {
2913+
__super__.call(this);
2914+
}
2915+
2916+
NeverObservable.prototype.subscribeCore = function (observer) {
2917+
return disposableEmpty;
2918+
};
2919+
2920+
return NeverObservable;
2921+
}(ObservableBase));
2922+
28862923
/**
2887-
* Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).
2924+
* Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).
28882925
* @returns {Observable} An observable sequence whose observers will never get called.
28892926
*/
28902927
var observableNever = Observable.never = function () {
2891-
return new AnonymousObservable(function () {
2892-
return disposableEmpty;
2893-
});
2928+
return new NeverObservable();
2929+
};
2930+
2931+
var PairsObservable = (function(__super__) {
2932+
inherits(PairsObservable, __super__);
2933+
function PairsObservable(obj, scheduler) {
2934+
this.obj = obj;
2935+
this.keys = Object.keys(obj);
2936+
this.scheduler = scheduler;
2937+
__super__.call(this);
2938+
}
2939+
2940+
PairsObservable.prototype.subscribeCore = function (observer) {
2941+
var sink = new PairsSink(observer, this);
2942+
return sink.run();
2943+
};
2944+
2945+
return PairsObservable;
2946+
}(ObservableBase));
2947+
2948+
function PairsSink(observer, parent) {
2949+
this.observer = observer;
2950+
this.parent = parent;
2951+
}
2952+
2953+
PairsSink.prototype.run = function () {
2954+
var observer = this.observer, obj = this.parent.obj, keys = this.parent.keys, len = keys.length;
2955+
function loopRecursive(i, recurse) {
2956+
if (i < len) {
2957+
var key = keys[i];
2958+
observer.onNext([key, obj[key]]);
2959+
recurse(i + 1);
2960+
} else {
2961+
observer.onCompleted();
2962+
}
2963+
}
2964+
2965+
return this.parent.scheduler.scheduleRecursiveWithState(0, loopRecursive);
28942966
};
28952967

28962968
/**
@@ -2900,19 +2972,8 @@
29002972
* @returns {Observable} An observable sequence of [key, value] pairs from the object.
29012973
*/
29022974
Observable.pairs = function (obj, scheduler) {
2903-
scheduler || (scheduler = Rx.Scheduler.currentThread);
2904-
return new AnonymousObservable(function (observer) {
2905-
var keys = Object.keys(obj), len = keys.length;
2906-
return scheduler.scheduleRecursiveWithState(0, function (idx, self) {
2907-
if (idx < len) {
2908-
var key = keys[idx];
2909-
observer.onNext([key, obj[key]]);
2910-
self(idx + 1);
2911-
} else {
2912-
observer.onCompleted();
2913-
}
2914-
});
2915-
});
2975+
scheduler || (scheduler = currentThreadScheduler);
2976+
return new PairsObservable(obj, scheduler);
29162977
};
29172978

29182979
var RangeObservable = (function(__super__) {
@@ -2985,6 +3046,37 @@
29853046
return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);
29863047
};
29873048

3049+
var JustObservable = (function(__super__) {
3050+
inherits(JustObservable, __super__);
3051+
function JustObservable(value, scheduler) {
3052+
this.value = value;
3053+
this.scheduler = scheduler;
3054+
__super__.call(this);
3055+
}
3056+
3057+
JustObservable.prototype.subscribeCore = function (observer) {
3058+
var sink = new JustSink(observer, this);
3059+
return sink.run();
3060+
};
3061+
3062+
function JustSink(observer, parent) {
3063+
this.observer = observer;
3064+
this.parent = parent;
3065+
}
3066+
3067+
function scheduleItem(s, state) {
3068+
var value = state[0], observer = state[1];
3069+
observer.onNext(value);
3070+
observer.onCompleted();
3071+
}
3072+
3073+
JustSink.prototype.run = function () {
3074+
return this.parent.scheduler.scheduleWithState([this.parent.value, this.observer], scheduleItem);
3075+
};
3076+
3077+
return JustObservable;
3078+
}(ObservableBase));
3079+
29883080
/**
29893081
* Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.
29903082
* There is an alias called 'just' or browsers <IE9.
@@ -2994,34 +3086,49 @@
29943086
*/
29953087
var observableReturn = Observable['return'] = Observable.just = Observable.returnValue = function (value, scheduler) {
29963088
isScheduler(scheduler) || (scheduler = immediateScheduler);
2997-
return new AnonymousObservable(function (o) {
2998-
return scheduler.scheduleWithState(value, function(_,v) {
2999-
o.onNext(v);
3000-
o.onCompleted();
3001-
});
3002-
});
3089+
return new JustObservable(value, scheduler);
30033090
};
30043091

3092+
var ThrowObservable = (function(__super__) {
3093+
inherits(ThrowObservable, __super__);
3094+
function ThrowObservable(error, scheduler) {
3095+
this.error = error;
3096+
this.scheduler = scheduler;
3097+
__super__.call(this);
3098+
}
3099+
3100+
ThrowObservable.prototype.subscribeCore = function (observer) {
3101+
var sink = new ThrowSink(observer, this);
3102+
return sink.run();
3103+
};
3104+
3105+
function ThrowSink(observer, parent) {
3106+
this.observer = observer;
3107+
this.parent = parent;
3108+
}
3109+
3110+
function scheduleItem(s, state) {
3111+
var error = state[0], observer = state[1];
3112+
observer.onError(error);
3113+
}
3114+
3115+
ThrowSink.prototype.run = function () {
3116+
return this.parent.scheduler.scheduleWithState([this.parent.error, this.observer], scheduleItem);
3117+
};
3118+
3119+
return ThrowObservable;
3120+
}(ObservableBase));
3121+
30053122
/**
30063123
* Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.
30073124
* There is an alias to this method called 'throwError' for browsers <IE9.
30083125
* @param {Mixed} error An object used for the sequence's termination.
30093126
* @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.
30103127
* @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.
30113128
*/
3012-
var observableThrow = Observable['throw'] = Observable.throwError = function (error, scheduler) {
3129+
var observableThrow = Observable['throw'] = Observable.throwError = Observable.throwException = function (error, scheduler) {
30133130
isScheduler(scheduler) || (scheduler = immediateScheduler);
3014-
return new AnonymousObservable(function (observer) {
3015-
return scheduler.schedule(function () {
3016-
observer.onError(error);
3017-
});
3018-
});
3019-
};
3020-
3021-
/** @deprecated use #some instead */
3022-
Observable.throwException = function () {
3023-
//deprecate('throwException', 'throwError');
3024-
return Observable.throwError.apply(null, arguments);
3131+
return new ThrowObservable(error, scheduler);
30253132
};
30263133

30273134
/**

dist/rx.all.compat.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rx.all.compat.min.js

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)