|  | import 'dart:convert'; | 
|  | import 'dart:io'; | 
|  | import 'dart:math'; | 
|  |  | 
|  | main() { | 
|  | for (int i = 0; i < 5; i++) { | 
|  | var sw = new Stopwatch()..start(); | 
|  | // Here we just read the contents of a file, but the string could come from | 
|  | // anywhere. | 
|  | var input = new File("big.json").readAsStringSync(); | 
|  | print("Reading took: ${sw.elapsedMicroseconds}us"); | 
|  |  | 
|  | // Measure synchronous decoding. | 
|  | sw.reset(); | 
|  | var decoded = JSON.decode(input); | 
|  | print("Decoding took: ${sw.elapsedMicroseconds}us"); | 
|  |  | 
|  | // Measure chunked decoding. | 
|  | sw.reset(); | 
|  | const chunkCount = 100; // Actually one more for simplicity. | 
|  | var result; | 
|  | // This is where the chunked converter will publish its result. | 
|  | var outSink = new ChunkedConversionSink.withCallback((List<dynamic> x) { | 
|  | result = x.single; | 
|  | }); | 
|  |  | 
|  | var inSink = JSON.decoder.startChunkedConversion(outSink); | 
|  | var chunkSw = new Stopwatch()..start(); | 
|  | var maxChunkTime = 0; | 
|  | var chunkSize = input.length ~/ chunkCount; | 
|  | int i; | 
|  | for (i = 0; i < 100; i++) { | 
|  | chunkSw.reset(); | 
|  | inSink.addSlice(input, i * chunkSize, (i + 1) * chunkSize, false); | 
|  | maxChunkTime = max(maxChunkTime, chunkSw.elapsedMicroseconds); | 
|  | } | 
|  | // Now add the last chunk (which could be non-empty because of the rounding | 
|  | // division). | 
|  | chunkSw.reset(); | 
|  | inSink.addSlice(input, i * chunkSize, input.length, true); | 
|  | maxChunkTime = max(maxChunkTime, chunkSw.elapsedMicroseconds); | 
|  | assert(result != null); | 
|  | print("Decoding took at most ${maxChunkTime}us per chunk," | 
|  | " and ${sw.elapsedMicroseconds} in total"); | 
|  | } | 
|  | } |