Mercurial > pub > ImplabNet
comparison Implab/Parallels/ArrayTraits.cs @ 89:ce0171cacec4 v2
improved performance of a chained map operation
author | cin |
---|---|
date | Wed, 08 Oct 2014 02:19:45 +0400 |
parents | 4f20870d0816 |
children | 4c0e5ef99986 |
comparison
equal
deleted
inserted
replaced
88:c4877ae77cee | 89:ce0171cacec4 |
---|---|
161 for (int i = 0; i < source.Length; i++) { | 161 for (int i = 0; i < source.Length; i++) { |
162 if(promise.IsResolved) | 162 if(promise.IsResolved) |
163 break; // stop processing in case of error or cancellation | 163 break; // stop processing in case of error or cancellation |
164 var idx = i; | 164 var idx = i; |
165 | 165 |
166 lock(locker) { | 166 if (Interlocked.Decrement(ref slots) < 0) { |
167 while(slots == 0) | 167 lock(locker) { |
168 Monitor.Wait(locker); | 168 while(slots < 0) |
169 slots--; | 169 Monitor.Wait(locker); |
170 } | |
170 } | 171 } |
172 | |
171 try { | 173 try { |
172 transform(source[i]) | 174 transform(source[i]) |
173 .Anyway(() => { | 175 .Anyway(() => { |
174 lock(locker) { | 176 Interlocked.Increment(ref slots); |
175 slots ++; | 177 lock (locker) { |
176 Monitor.Pulse(locker); | 178 Monitor.Pulse(locker); |
177 } | 179 } |
178 }) | 180 }) |
179 .Last( | 181 .Last( |
180 x => { | 182 x => { |
181 res[idx] = x; | 183 res[idx] = x; |
182 var left = Interlocked.Decrement(ref pending); | 184 var left = Interlocked.Decrement(ref pending); |
183 if (left == 0) | 185 if (left == 0) |
184 promise.Resolve(res); | 186 promise.Resolve(res); |
185 }, | 187 }, |
186 e => promise.Reject(e) | 188 promise.Reject |
187 ); | 189 ); |
188 | 190 |
189 } catch (Exception e) { | 191 } catch (Exception e) { |
190 promise.Reject(e); | 192 promise.Reject(e); |
191 } | 193 } |