diff --git a/benchmarks/AsyncLiveVars/dart2/AsyncLiveVars.dart b/benchmarks/AsyncLiveVars/dart2/AsyncLiveVars.dart deleted file mode 100644 index f3d829a2b0a..00000000000 --- a/benchmarks/AsyncLiveVars/dart2/AsyncLiveVars.dart +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// Micro-benchmark for testing async/await performance in presence of -// different number of live values across await. - -// @dart=2.9 - -import 'dart:async'; - -import 'package:benchmark_harness/benchmark_harness.dart'; - -class MockClass { - static final String str = "${int.parse('42')}"; - static final List list = List.filled( - int.parse('3'), - int.parse('42'), - ); - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - String get1() => str; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - List get2() => list; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - void use1(String a0) => a0.length; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - void use2(String a0, List a1) => a0.length + a1.length; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - void use4(String a0, List a1, String a2, List a3) => - a0.length + a1.length + a2.length + a3.length; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - void use8( - String a0, - List a1, - String a2, - List a3, - String a4, - List a5, - String a6, - List a7, - ) => - a0.length + - a1.length + - a2.length + - a3.length + - a4.length + - a5.length + - a6.length + - a7.length; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - Future asyncMethod() async {} -} - -class MockClass2 { - static int val1 = int.parse('42'); - static int val2 = int.parse('43'); - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - int get1() => val1; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - int get2() => val2; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - void use1(int a0) => a0; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - void use2(int a0, int a1) => a0 + a1; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - void use4(int a0, int a1, int a2, int a3) => a0 + a1 + a2 + a3; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - Future asyncMethod() async {} -} - -class LiveVarsBench extends AsyncBenchmarkBase { - LiveVarsBench(String name) : super(name); - @override - Future exercise() async { - // These micro-benchmarks are too small, so - // make a larger number of iterations per measurement. - for (var i = 0; i < 10000; i++) { - await run(); - } - } -} - -class LiveObj1 extends LiveVarsBench { - LiveObj1() : super('AsyncLiveVars.LiveObj1'); - final field1 = MockClass(); - @override - Future run() async { - final obj1 = field1.get1(); - await field1.asyncMethod(); - field1.use1(obj1); - await field1.asyncMethod(); - field1.use1(obj1); - await field1.asyncMethod(); - field1.use1(obj1); - } -} - -class LiveObj2 extends LiveVarsBench { - LiveObj2() : super('AsyncLiveVars.LiveObj2'); - final field1 = MockClass(); - @override - Future run() async { - final obj1 = field1.get1(); - final obj2 = field1.get2(); - await field1.asyncMethod(); - field1.use1(obj1); - await field1.asyncMethod(); - field1.use1(obj1); - await field1.asyncMethod(); - field1.use2(obj1, obj2); - } -} - -class LiveObj4 extends LiveVarsBench { - LiveObj4() : super('AsyncLiveVars.LiveObj4'); - final field1 = MockClass(); - final field2 = MockClass(); - @override - Future run() async { - final obj1 = field1.get1(); - final obj2 = field1.get2(); - final obj3 = field2.get1(); - final obj4 = field2.get2(); - await field1.asyncMethod(); - field1.use1(obj1); - await field1.asyncMethod(); - field2.use1(obj3); - await field2.asyncMethod(); - field1.use4(obj1, obj2, obj3, obj4); - } -} - -class LiveObj8 extends LiveVarsBench { - LiveObj8() : super('AsyncLiveVars.LiveObj8'); - final field1 = MockClass(); - final field2 = MockClass(); - final field3 = MockClass(); - final field4 = MockClass(); - @override - Future run() async { - final obj1 = field1.get1(); - final obj2 = field1.get2(); - final obj3 = field2.get1(); - final obj4 = field2.get2(); - final obj5 = field3.get1(); - final obj6 = field3.get2(); - final obj7 = field4.get1(); - final obj8 = field4.get2(); - await field1.asyncMethod(); - field1.use1(obj1); - await field2.asyncMethod(); - field3.use2(obj5, obj6); - await field4.asyncMethod(); - field2.use8(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8); - } -} - -class LiveObj16 extends LiveVarsBench { - LiveObj16() : super('AsyncLiveVars.LiveObj16'); - final field1 = MockClass(); - final field2 = MockClass(); - final field3 = MockClass(); - final field4 = MockClass(); - final field5 = MockClass(); - final field6 = MockClass(); - final field7 = MockClass(); - final field8 = MockClass(); - @override - Future run() async { - final obj1 = field1.get1(); - final obj2 = field1.get2(); - final obj3 = field2.get1(); - final obj4 = field2.get2(); - final obj5 = field3.get1(); - final obj6 = field3.get2(); - final obj7 = field4.get1(); - final obj8 = field4.get2(); - final obj9 = field5.get1(); - final obj10 = field5.get2(); - final obj11 = field6.get1(); - final obj12 = field6.get2(); - final obj13 = field7.get1(); - final obj14 = field7.get2(); - final obj15 = field8.get1(); - final obj16 = field8.get2(); - await field1.asyncMethod(); - field1.use1(obj1); - await field2.asyncMethod(); - field5.use2(obj11, obj12); - await field4.asyncMethod(); - field2.use8(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8); - field3.use8(obj9, obj10, obj11, obj12, obj13, obj14, obj15, obj16); - } -} - -class LiveInt1 extends LiveVarsBench { - LiveInt1() : super('AsyncLiveVars.LiveInt1'); - final field1 = MockClass2(); - @override - Future run() async { - final int1 = field1.get1(); - await field1.asyncMethod(); - field1.use1(int1); - await field1.asyncMethod(); - field1.use1(int1); - await field1.asyncMethod(); - field1.use1(int1); - } -} - -class LiveInt4 extends LiveVarsBench { - LiveInt4() : super('AsyncLiveVars.LiveInt4'); - final field1 = MockClass2(); - final field2 = MockClass2(); - @override - Future run() async { - final int1 = field1.get1(); - final int2 = field1.get2(); - final int3 = field2.get1(); - final int4 = field2.get2(); - await field1.asyncMethod(); - field1.use1(int1); - await field1.asyncMethod(); - field2.use1(int3); - await field2.asyncMethod(); - field1.use4(int1, int2, int3, int4); - } -} - -class LiveObj2Int2 extends LiveVarsBench { - LiveObj2Int2() : super('AsyncLiveVars.LiveObj2Int2'); - final field1 = MockClass(); - final field2 = MockClass2(); - @override - Future run() async { - final obj1 = field1.get1(); - final obj2 = field1.get2(); - final int1 = field2.get1(); - final int2 = field2.get2(); - await field1.asyncMethod(); - field1.use1(obj1); - await field1.asyncMethod(); - field2.use1(int1); - await field2.asyncMethod(); - field1.use2(obj1, obj2); - field2.use2(int1, int2); - } -} - -class LiveObj4Int4 extends LiveVarsBench { - LiveObj4Int4() : super('AsyncLiveVars.LiveObj4Int4'); - final field1 = MockClass(); - final field2 = MockClass(); - final field3 = MockClass2(); - final field4 = MockClass2(); - @override - Future run() async { - final obj1 = field1.get1(); - final obj2 = field1.get2(); - final obj3 = field2.get1(); - final obj4 = field2.get2(); - final int1 = field3.get1(); - final int2 = field3.get2(); - final int3 = field4.get1(); - final int4 = field4.get2(); - await field1.asyncMethod(); - field1.use1(obj1); - await field2.asyncMethod(); - field3.use2(int2, int4); - await field4.asyncMethod(); - field2.use4(obj1, obj2, obj3, obj4); - field4.use4(int1, int2, int3, int4); - } -} - -Future main() async { - final benchmarks = [ - LiveObj1(), - LiveObj2(), - LiveObj4(), - LiveObj8(), - LiveObj16(), - LiveInt1(), - LiveInt4(), - LiveObj2Int2(), - LiveObj4Int4(), - ]; - for (final bench in benchmarks) { - await bench.report(); - } -} diff --git a/benchmarks/BigIntParsePrint/dart2/BigIntParsePrint.dart b/benchmarks/BigIntParsePrint/dart2/BigIntParsePrint.dart deleted file mode 100644 index 3edbaac7694..00000000000 --- a/benchmarks/BigIntParsePrint/dart2/BigIntParsePrint.dart +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// ignore_for_file: avoid_function_literals_in_foreach_calls - -// @dart=2.9 - -import 'dart:math' show Random; - -import 'package:benchmark_harness/benchmark_harness.dart'; -import 'package:fixnum/fixnum.dart'; - -import 'native_version_dummy.dart' - if (dart.library.js) 'native_version_javascript.dart'; - -// Benchmark BigInt and Int64 formatting and parsing. - -// A global sink that is used in the [check] method ensures that the results are -// not optimized. -dynamic sink1, sink2; - -void check(bool sink2isEven) { - if (sink1.codeUnits.last.isEven != sink2isEven) { - throw StateError('Inconsistent $sink1 vs $sink2'); - } -} - -// These benchmarks measure digit-throughput for parsing and formatting. -// -// Each benchmark targets processing [requiredDigits] decimal digits, spread -// over a list of input values. This makes the benchmarks for different integer -// lengths roughly comparable. The number is chosen so that most benchmarks -// have very close to this number of digits. It corresponds to nine 4096-bit -// integers. -const requiredDigits = 11106; - -class Benchmark extends BenchmarkBase { - final List strings; - Benchmark(String name, int bits, {bool forInt = false}) - : strings = generateStrings(bits, forInt), - super(name); - - static List generateStrings(int bits, bool forInt) { - final List strings = []; - final BigInt seed = (BigInt.one << bits) - BigInt.one; - var b = seed; - var restartDelta = BigInt.zero; - var totalLength = 0; - while (totalLength < requiredDigits) { - if (b.bitLength < bits) { - restartDelta += seed >> 20; - restartDelta += BigInt.one; - // Restart from a slightly reduced seed to generate different numbers. - b = seed - restartDelta; - } - var string = b.toString(); - - // Web integers lose precision due to rounding for larger values. Make - // sure the string will round-trip correctly. - if (forInt) string = int.parse(string).toString(); - - strings.add(string); - totalLength += string.length; - var delta = b >> 8; - if (delta == BigInt.zero) delta = BigInt.one; - b = b - delta; - } - return strings; - } -} - -class ParseBigIntBenchmark extends Benchmark { - ParseBigIntBenchmark(String name, int bits) : super(name, bits); - - @override - void run() { - for (final s in strings) { - final b = BigInt.parse(s); - sink1 = s; - sink2 = b; - } - check(sink2.isEven); - } -} - -class ParseInt64Benchmark extends Benchmark { - ParseInt64Benchmark(String name, int bits) : super(name, bits); - - @override - void run() { - for (final s in strings) { - final b = Int64.parseInt(s); - sink1 = s; - sink2 = b; - } - check(sink2.isEven); - } -} - -class ParseIntBenchmark extends Benchmark { - ParseIntBenchmark(String name, int bits) : super(name, bits, forInt: true); - - @override - void run() { - for (final s in strings) { - final b = int.parse(s); - sink1 = s; - sink2 = b; - } - check(sink2.isEven); - } -} - -class ParseJsBigIntBenchmark extends Benchmark { - ParseJsBigIntBenchmark(String name, int bits) : super(name, bits); - - @override - void run() { - for (final s in strings) { - final b = nativeBigInt.parse(s); - sink1 = s; - sink2 = b; - } - check(nativeBigInt.isEven(sink2)); - } -} - -class FormatBigIntBenchmark extends Benchmark { - final List values = []; - - FormatBigIntBenchmark(String name, int bits) : super(name, bits); - - @override - void setup() { - for (String s in strings) { - final BigInt b = BigInt.parse(s); - values.add(b - BigInt.one); // We add 'one' back later. - } - } - - @override - void run() { - final one = BigInt.one; - for (final b0 in values) { - // Instances might cache `toString()`, so use arithmetic to create a new - // instance to try to protect against measuring a cached string. - final b = b0 + one; - final s = b.toString(); - sink1 = s; - sink2 = b; - } - check(sink2.isEven); - } -} - -class FormatIntBenchmark extends Benchmark { - final List values = []; - - FormatIntBenchmark(String name, int bits) : super(name, bits, forInt: true); - - @override - void setup() { - for (String s in strings) { - final int b = int.parse(s); - values.add(b - 4096); // We add this back later. - } - } - - @override - void run() { - for (final b0 in values) { - // Instances might cache `toString()`, so use arithmetic to create a new - // instance to try to protect against measuring a cached string. We use - // 4096 to avoid the arithmetic being a no-op due to rounding on web - // integers (i.e. doubles). - final b = b0 + 4096; - final s = b.toString(); - sink1 = s; - sink2 = b; - } - check(sink2.isEven); - } -} - -class FormatInt64Benchmark extends Benchmark { - final List values = []; - - FormatInt64Benchmark(String name, int bits) : super(name, bits); - - @override - void setup() { - for (String s in strings) { - final b = Int64.parseInt(s); - values.add(b - Int64.ONE); // We add this back later. - } - } - - @override - void run() { - final one = Int64.ONE; - for (final b0 in values) { - // Instances might cache `toString()`, so use arithmetic to create a new - // instance to try to protect against measuring a cached string. - final b = b0 + one; - final s = b.toStringUnsigned(); - sink1 = s; - sink2 = b; - } - check(sink2.isEven); - } -} - -class FormatJsBigIntBenchmark extends Benchmark { - final List values = []; - - FormatJsBigIntBenchmark(String name, int bits) : super(name, bits); - - @override - void setup() { - final one = nativeBigInt.one; - for (String s in strings) { - final b = nativeBigInt.parse(s); - values.add(nativeBigInt.subtract(b, one)); // We add this back later. - } - } - - @override - void run() { - final one = nativeBigInt.one; - for (final b0 in values) { - // Instances might cache `toString()`, so use arithmetic to create a new - // instance to try to protect against measuring a cached string. - final b = nativeBigInt.add(b0, one); - final s = nativeBigInt.toStringMethod(b); - sink1 = s; - sink2 = b; - } - check(nativeBigInt.isEven(sink2)); - } -} - -/// [DummyBenchmark] instantly returns a fixed 'slow' result. -class DummyBenchmark extends BenchmarkBase { - DummyBenchmark(String name) : super(name); - @override - // A rate of one run per 2s, with a millisecond of noise. Some variation is - // needed for Golem's noise-based filtering and regression detection. - double measure() => (2000 + Random().nextDouble() - 0.5) * 1000; -} - -/// Create [ParseJsBigIntBenchmark], or a dummy benchmark if JavaScript BigInt -/// is not available. This is to satisfy Golem's constraint that group -/// benchmarks always produce results for the same set of series. -BenchmarkBase Function() selectParseNativeBigIntBenchmark( - String name, - int bits, -) { - return nativeBigInt.enabled - ? () => ParseJsBigIntBenchmark(name, bits) - : () => DummyBenchmark(name); -} - -/// Create [FormatJsBigIntBenchmark], or a dummy benchmark if JavaScript BigInt -/// is not available. This is to satisfy Golem's constraint that group -/// benchmarks always produce results for the same set of series. -BenchmarkBase Function() selectFormatNativeBigIntBenchmark( - String name, - int bits, -) { - return nativeBigInt.enabled - ? () => FormatJsBigIntBenchmark(name, bits) - : () => DummyBenchmark(name); -} - -void main() { - final benchmarks = [ - () => ParseIntBenchmark('Int.parse.0009.bits', 9), - () => ParseIntBenchmark('Int.parse.0032.bits', 32), - // Use '63' bits to avoid 64-bit arithmetic overflowing to negative. Keep - // the name as '64' to help comparisons. The effect of an incorrect number - // is reduced since benchmark results are normalized to a 'per digit' score - () => ParseIntBenchmark('Int.parse.0064.bits', 63), - () => ParseInt64Benchmark('Int64.parse.0009.bits', 9), - () => ParseInt64Benchmark('Int64.parse.0032.bits', 32), - () => ParseInt64Benchmark('Int64.parse.0064.bits', 64), - () => ParseBigIntBenchmark('BigInt.parse.0009.bits', 9), - () => ParseBigIntBenchmark('BigInt.parse.0032.bits', 32), - () => ParseBigIntBenchmark('BigInt.parse.0064.bits', 64), - () => ParseBigIntBenchmark('BigInt.parse.0256.bits', 256), - () => ParseBigIntBenchmark('BigInt.parse.1024.bits', 1024), - () => ParseBigIntBenchmark('BigInt.parse.4096.bits', 4096), - selectParseNativeBigIntBenchmark('JsBigInt.parse.0009.bits', 9), - selectParseNativeBigIntBenchmark('JsBigInt.parse.0032.bits', 32), - selectParseNativeBigIntBenchmark('JsBigInt.parse.0064.bits', 64), - selectParseNativeBigIntBenchmark('JsBigInt.parse.0256.bits', 256), - selectParseNativeBigIntBenchmark('JsBigInt.parse.1024.bits', 1024), - selectParseNativeBigIntBenchmark('JsBigInt.parse.4096.bits', 4096), - () => FormatIntBenchmark('Int.toString.0009.bits', 9), - () => FormatIntBenchmark('Int.toString.0032.bits', 32), - () => FormatIntBenchmark('Int.toString.0064.bits', 63), // '63': See above. - () => FormatInt64Benchmark('Int64.toString.0009.bits', 9), - () => FormatInt64Benchmark('Int64.toString.0032.bits', 32), - () => FormatInt64Benchmark('Int64.toString.0064.bits', 64), - () => FormatBigIntBenchmark('BigInt.toString.0009.bits', 9), - () => FormatBigIntBenchmark('BigInt.toString.0032.bits', 32), - () => FormatBigIntBenchmark('BigInt.toString.0064.bits', 64), - () => FormatBigIntBenchmark('BigInt.toString.0256.bits', 256), - () => FormatBigIntBenchmark('BigInt.toString.1024.bits', 1024), - () => FormatBigIntBenchmark('BigInt.toString.4096.bits', 4096), - selectFormatNativeBigIntBenchmark('JsBigInt.toString.0009.bits', 9), - selectFormatNativeBigIntBenchmark('JsBigInt.toString.0032.bits', 32), - selectFormatNativeBigIntBenchmark('JsBigInt.toString.0064.bits', 64), - selectFormatNativeBigIntBenchmark('JsBigInt.toString.0256.bits', 256), - selectFormatNativeBigIntBenchmark('JsBigInt.toString.1024.bits', 1024), - selectFormatNativeBigIntBenchmark('JsBigInt.toString.4096.bits', 4096), - ]; - - // Warm up all benchmarks to ensure consistent behaviors of shared code. - benchmarks.forEach( - (bm) => - bm() - ..setup() - ..run() - ..run(), - ); - - benchmarks.forEach((bm) => bm().report()); -} diff --git a/benchmarks/BigIntParsePrint/dart2/native_version.dart b/benchmarks/BigIntParsePrint/dart2/native_version.dart deleted file mode 100644 index 9ca0fa00f70..00000000000 --- a/benchmarks/BigIntParsePrint/dart2/native_version.dart +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -abstract class NativeBigIntMethods { - bool get enabled; - - Object parse(String string); - String toStringMethod(Object value); - - Object fromInt(int i); - - Object get one; - Object get eight; - - int bitLength(Object value); - bool isEven(Object value); - - Object add(Object left, Object right); - Object shiftLeft(Object value, Object count); - Object shiftRight(Object value, Object count); - Object subtract(Object left, Object right); -} diff --git a/benchmarks/BigIntParsePrint/dart2/native_version_dummy.dart b/benchmarks/BigIntParsePrint/dart2/native_version_dummy.dart deleted file mode 100644 index 9fb7ee62e23..00000000000 --- a/benchmarks/BigIntParsePrint/dart2/native_version_dummy.dart +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'native_version.dart'; - -const NativeBigIntMethods nativeBigInt = _DummyMethods(); - -class _DummyMethods implements NativeBigIntMethods { - const _DummyMethods(); - - @override - bool get enabled => false; - - static Object bad(String message) => UnimplementedError(message); - - @override - Object parse(String string) => throw bad('parse'); - - @override - String toStringMethod(Object value) => throw bad('toStringMethod'); - - @override - Object fromInt(int i) => throw bad('fromInt'); - - @override - Object get one => throw bad('one'); - - @override - Object get eight => throw bad('eight'); - - @override - int bitLength(Object value) => throw bad('bitLength'); - - @override - bool isEven(Object value) => throw bad('isEven'); - - @override - Object add(Object left, Object right) => throw bad('add'); - - @override - Object shiftLeft(Object value, Object count) => throw bad('shiftLeft'); - - @override - Object shiftRight(Object value, Object count) => throw bad('shiftRight'); - - @override - Object subtract(Object left, Object right) => throw bad('subtract'); -} diff --git a/benchmarks/BigIntParsePrint/dart2/native_version_javascript.dart b/benchmarks/BigIntParsePrint/dart2/native_version_javascript.dart deleted file mode 100644 index dfde2f80981..00000000000 --- a/benchmarks/BigIntParsePrint/dart2/native_version_javascript.dart +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -@JS() -library native_version_javascript; - -import 'package:js/js.dart'; -import 'native_version.dart'; - -const NativeBigIntMethods nativeBigInt = _Methods(); - -@JS('eval') -external Object _eval(String s); - -@JS('bigint_parse') -external Object _parse(String s); - -@JS('bigint_toString') -external String _toStringMethod(Object o); - -@JS('bigint_bitLength') -external int _bitLength(Object o); - -@JS('bigint_isEven') -external bool _isEven(Object o); - -@JS('bigint_add') -external Object _add(Object left, Object right); - -@JS('bigint_shiftLeft') -external Object _shiftLeft(Object o, Object i); - -@JS('bigint_shiftRight') -external Object _shiftRight(Object o, Object i); - -@JS('bigint_subtract') -external Object _subtract(Object left, Object right); - -@JS('bigint_fromInt') -external Object _fromInt(int i); - -class _Methods implements NativeBigIntMethods { - static bool _initialized = false; - static bool _enabled = false; - - const _Methods(); - - @override - bool get enabled { - if (!_initialized) { - _initialize(); - } - return _enabled; - } - - void _initialize() { - _initialized = true; - try { - _setup(); - _enabled = true; - } catch (e) { - // We get here if the JavaScript implementation does not have BigInt (or - // run in a stand-alone JavaScript implementation without the right - // 'preamble'). - // - // Print so we can see what failed. - print(e); - } - } - - @override - Object parse(String string) => _parse(string); - - @override - String toStringMethod(Object value) => _toStringMethod(value); - - @override - Object fromInt(int i) => _fromInt(i); - - @override - Object get one => _one; - - @override - Object get eight => _eight; - - @override - int bitLength(Object value) => _bitLength(value); - - @override - bool isEven(Object value) => _isEven(value); - - @override - Object add(Object left, Object right) => _add(left, right); - - @override - Object shiftLeft(Object value, Object count) => _shiftLeft(value, count); - - @override - Object shiftRight(Object value, Object count) => _shiftRight(value, count); - - @override - Object subtract(Object left, Object right) => _subtract(left, right); -} - -void _setup() { - _one = _eval('1n'); // Throws if JavaScript does not have BigInt. - _eight = _eval('8n'); - - _eval('self.bigint_parse = function parse(s) { return BigInt(s); }'); - _eval('self.bigint_toString = function toString(b) { return b.toString(); }'); - _eval('self.bigint_add = function add(a, b) { return a + b; }'); - _eval('self.bigint_shiftLeft = function shl(v, i) { return v << i; }'); - _eval('self.bigint_shiftRight = function shr(v, i) { return v >> i; }'); - _eval('self.bigint_subtract = function subtract(a, b) { return a - b; }'); - _eval('self.bigint_fromInt = function fromInt(i) { return BigInt(i); }'); - - _eval( - 'self.bigint_bitLength = function bitLength(b) {' - 'return b == 0 ? 0 : (b < 0 ? ~b : b).toString(2).length;' - '}', - ); - _eval('self.bigint_isEven = function isEven(b) { return (b & 1n) == 0n; }'); -} - -// `dynamic` to allow null initialization pre- and post- NNBD. -dynamic _one; -dynamic _eight; diff --git a/benchmarks/Calls/dart2/Calls.dart b/benchmarks/Calls/dart2/Calls.dart deleted file mode 100644 index 23e992fba32..00000000000 --- a/benchmarks/Calls/dart2/Calls.dart +++ /dev/null @@ -1,898 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// Micro-benchmarks for sync/sync*/async/async* functionality. - -// @dart=2.9 - -import 'dart:async'; - -const int iterationLimitAsync = 200; -const int sumOfIterationLimitAsync = - iterationLimitAsync * (iterationLimitAsync - 1) ~/ 2; - -const int iterationLimitSync = 5000; -const int sumOfIterationLimitSync = - iterationLimitSync * (iterationLimitSync - 1) ~/ 2; - -Future main() async { - final target = Target(); - final target2 = Target2(); - final target3 = Target3(); - - // Ensure the call sites will have another target in the ICData. - await performAwaitCallsClosureTargetPolymorphic(returnAsync); - await performAwaitCallsClosureTargetPolymorphic(returnFuture); - await performAwaitCallsClosureTargetPolymorphic(returnFutureOr); - await performAwaitAsyncCallsInstanceTargetPolymorphic(target); - await performAwaitAsyncCallsInstanceTargetPolymorphic(target2); - await performAwaitAsyncCallsInstanceTargetPolymorphic(target3); - await performAwaitFutureCallsInstanceTargetPolymorphic(target); - await performAwaitFutureCallsInstanceTargetPolymorphic(target2); - await performAwaitFutureCallsInstanceTargetPolymorphic(target3); - await performAwaitFutureOrCallsInstanceTargetPolymorphic(target); - await performAwaitFutureOrCallsInstanceTargetPolymorphic(target2); - await performAwaitFutureOrCallsInstanceTargetPolymorphic(target3); - performSyncCallsInstanceTargetPolymorphic(target); - performSyncCallsInstanceTargetPolymorphic(target2); - performSyncCallsInstanceTargetPolymorphic(target3); - await performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits(target); - await performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits(target2); - await performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits(target3); - - await performAwaitForIterationPolymorphic(generateNumbersAsyncStar); - await performAwaitForIterationPolymorphic(generateNumbersAsyncStar2); - await performAwaitForIterationPolymorphic(generateNumbersManualAsync); - await performAwaitForIterationPolymorphic(generateNumbersAsyncStarManyYields); - performSyncIterationPolymorphic(generateNumbersSyncStar); - performSyncIterationPolymorphic(generateNumbersSyncStar2); - performSyncIterationPolymorphic(generateNumbersManual); - performSyncIterationPolymorphic(generateNumbersSyncStarManyYields); - - await AsyncCallBenchmark( - 'Calls.AwaitAsyncCall', - performAwaitAsyncCalls, - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitAsyncCallClosureTargetPolymorphic', - () => performAwaitCallsClosureTargetPolymorphic(returnAsync), - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitAsyncCallInstanceTargetPolymorphic', - () => performAwaitAsyncCallsInstanceTargetPolymorphic(target), - ).report(); - - await AsyncCallBenchmark( - 'Calls.AwaitFutureCall', - performAwaitFutureCalls, - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitFutureCallClosureTargetPolymorphic', - () => performAwaitCallsClosureTargetPolymorphic(returnFuture), - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitFutureCallInstanceTargetPolymorphic', - () => performAwaitFutureCallsInstanceTargetPolymorphic(target), - ).report(); - - await AsyncCallBenchmark( - 'Calls.AwaitFutureOrCall', - performAwaitFutureOrCalls, - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitFutureOrCallClosureTargetPolymorphic', - () => performAwaitCallsClosureTargetPolymorphic(returnFutureOr), - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitFutureOrCallInstanceTargetPolymorphic', - () => performAwaitFutureOrCallsInstanceTargetPolymorphic(target), - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitFutureOrCallInstanceTargetPolymorphicManyAwaits', - () => performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits(target), - ).report(); - - await AsyncCallBenchmark( - 'Calls.AwaitForAsyncStarStreamPolymorphic', - () => performAwaitForIterationPolymorphic(generateNumbersAsyncStar), - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitForAsyncStarStreamPolymorphicManyYields', - () => - performAwaitForIterationPolymorphic(generateNumbersAsyncStarManyYields), - ).report(); - await AsyncCallBenchmark( - 'Calls.AwaitForManualStreamPolymorphic', - () => performAwaitForIterationPolymorphic(generateNumbersManualAsync), - ).report(); - - SyncCallBenchmark('Calls.SyncCall', performSyncCalls).report(); - SyncCallBenchmark( - 'Calls.SyncCallClosureTarget', - () => performSyncCallsClosureTarget(returnSync), - ).report(); - SyncCallBenchmark( - 'Calls.SyncCallInstanceTargetPolymorphic', - () => performSyncCallsInstanceTargetPolymorphic(target), - ).report(); - - SyncCallBenchmark( - 'Calls.IterableSyncStarIterablePolymorphic', - () => performSyncIterationPolymorphic(generateNumbersSyncStar), - ).report(); - SyncCallBenchmark( - 'Calls.IterableManualIterablePolymorphic', - () => performSyncIterationPolymorphic(generateNumbersManual), - ).report(); - SyncCallBenchmark( - 'Calls.IterableManualIterablePolymorphicManyYields', - () => performSyncIterationPolymorphic(generateNumbersSyncStarManyYields), - ).report(); -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitCallsClosureTargetPolymorphic( - FutureOr Function(int) fun, -) async { - int sum = 0; - for (int i = 0; i < iterationLimitAsync; ++i) { - sum += await fun(i); - } - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitAsyncCallsInstanceTargetPolymorphic( - Target target, -) async { - int sum = 0; - for (int i = 0; i < iterationLimitAsync; ++i) { - sum += await target.returnAsync(i); - } - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitFutureCallsInstanceTargetPolymorphic( - Target target, -) async { - int sum = 0; - for (int i = 0; i < iterationLimitAsync; ++i) { - sum += await target.returnFuture(i); - } - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitFutureOrCallsInstanceTargetPolymorphic( - Target target, -) async { - int sum = 0; - for (int i = 0; i < iterationLimitAsync; ++i) { - sum += await target.returnFutureOr(i); - } - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitAsyncCalls() async { - int sum = 0; - for (int i = 0; i < iterationLimitAsync; ++i) { - sum += await returnAsync(i); - } - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitFutureCalls() async { - int sum = 0; - for (int i = 0; i < iterationLimitAsync; ++i) { - sum += await returnFuture(i); - } - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitFutureOrCalls() async { - int sum = 0; - for (int i = 0; i < iterationLimitAsync; ++i) { - sum += await returnFutureOr(i); - } - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitAsyncCallsInstanceTargetPolymorphicManyAwaits( - Target t, -) async { - int sum = 0; - int i = 0; - - final int blockLimit = iterationLimitAsync - (iterationLimitAsync % 80); - while (i < blockLimit) { - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - sum += await t.returnAsync(i++); - } - - while (i < iterationLimitAsync) { - sum += await t.returnAsync(i++); - } - - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future performAwaitForIterationPolymorphic( - Stream Function(int) fun, -) async { - int sum = 0; - await for (int value in fun(iterationLimitAsync)) { - sum += value; - } - if (sum != sumOfIterationLimitAsync) throw 'BUG'; - return iterationLimitAsync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -int performSyncCallsClosureTarget(int Function(int) fun) { - int sum = 0; - for (int i = 0; i < iterationLimitSync; ++i) { - sum += fun(i); - } - if (sum != sumOfIterationLimitSync) throw 'BUG'; - return iterationLimitSync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -int performSyncCallsInstanceTargetPolymorphic(Target target) { - int sum = 0; - for (int i = 0; i < iterationLimitSync; ++i) { - sum += target.returnSync(i); - } - if (sum != sumOfIterationLimitSync) throw 'BUG'; - return iterationLimitSync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -int performSyncCalls() { - int sum = 0; - for (int i = 0; i < iterationLimitSync; ++i) { - sum += returnSync(i); - } - if (sum != sumOfIterationLimitSync) throw 'BUG'; - return iterationLimitSync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -int performSyncIterationPolymorphic(Iterable Function(int) fun) { - int sum = 0; - for (int value in fun(iterationLimitSync)) { - sum += value; - } - if (sum != sumOfIterationLimitSync) throw 'BUG'; - return iterationLimitSync; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -FutureOr returnFutureOr(int i) => i; - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future returnFuture(int i) => Future.value(i); - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Future returnAsync(int i) async => i; - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Stream generateNumbersAsyncStar(int limit) async* { - for (int i = 0; i < limit; ++i) { - yield i; - } -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Stream generateNumbersAsyncStar2(int limit) async* { - for (int i = 0; i < limit; ++i) { - yield i; - } -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Stream generateNumbersManualAsync(int limit) { - int current = 0; - final controller = StreamController(sync: true); - void emit() { - while (true) { - if (controller.isPaused || !controller.hasListener) return; - if (current < limit) { - controller.add(current++); - } else { - controller.close(); - return; - } - } - } - - void run() { - scheduleMicrotask(emit); - } - - controller.onListen = run; - controller.onResume = run; - - return controller.stream; -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -int returnSync(int i) => i; - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Iterable generateNumbersSyncStar(int limit) sync* { - for (int i = 0; i < limit; ++i) { - yield i; - } -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Iterable generateNumbersSyncStar2(int limit) sync* { - for (int i = 0; i < limit; ++i) { - yield i; - } -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Iterable generateNumbersManual(int limit) => - Iterable.generate(limit, (int i) => i); - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Iterable generateNumbersSyncStarManyYields(int limit) sync* { - int i = 0; - - final int blockLimit = limit - (limit % (20 * 7)); - while (i < blockLimit) { - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - } - - while (i < limit) { - yield i++; - } -} - -@pragma('vm:never-inline') -@pragma('dart2js:noInline') -Stream generateNumbersAsyncStarManyYields(int limit) async* { - int i = 0; - - final int blockLimit = limit - (limit % (20 * 7)); - while (i < blockLimit) { - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - yield i++; - } - - while (i < limit) { - yield i++; - } -} - -class Target { - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - FutureOr returnFutureOr(int i) => i; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - Future returnFuture(int i) => Future.value(i); - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - Future returnAsync(int i) async => i; - - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - int returnSync(int i) => i; -} - -class Target2 extends Target { - @override - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - FutureOr returnFutureOr(int i) => i; - - @override - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - Future returnFuture(int i) => Future.value(i); - - @override - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - Future returnAsync(int i) async => i; - - @override - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - int returnSync(int i) => i; -} - -class Target3 extends Target { - @override - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - FutureOr returnFutureOr(int i) => i; - - @override - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - Future returnFuture(int i) => Future.value(i); - - @override - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - Future returnAsync(int i) async => i; - - @override - @pragma('vm:never-inline') - @pragma('dart2js:noInline') - int returnSync(int i) => i; -} - -typedef PerformSyncCallsFunction = int Function(); -typedef PerformAsyncCallsFunction = Future Function(); - -class SyncCallBenchmark { - final String name; - final PerformSyncCallsFunction performCalls; - - SyncCallBenchmark(this.name, this.performCalls); - - // Returns the number of nanoseconds per call. - double measureFor(Duration duration) { - final sw = Stopwatch()..start(); - final durationInMicroseconds = duration.inMicroseconds; - - int numberOfCalls = 0; - int totalMicroseconds = 0; - do { - numberOfCalls += performCalls(); - totalMicroseconds = sw.elapsedMicroseconds; - } while (totalMicroseconds < durationInMicroseconds); - - final int totalNanoseconds = sw.elapsed.inMicroseconds * 1000; - return totalNanoseconds / numberOfCalls; - } - - // Runs warmup phase, runs benchmark and reports result. - void report() { - // Warmup for 100 ms. - measureFor(const Duration(milliseconds: 100)); - - // Run benchmark for 2 seconds. - final double nsPerCall = measureFor(const Duration(seconds: 2)); - - // Report result. - print('$name(RunTimeRaw): $nsPerCall ns.'); - } -} - -class AsyncCallBenchmark { - final String name; - final PerformAsyncCallsFunction performCalls; - - AsyncCallBenchmark(this.name, this.performCalls); - - // Returns the number of nanoseconds per call. - Future measureFor(Duration duration) async { - final sw = Stopwatch()..start(); - final durationInMicroseconds = duration.inMicroseconds; - - int numberOfCalls = 0; - int totalMicroseconds = 0; - do { - numberOfCalls += await performCalls(); - totalMicroseconds = sw.elapsedMicroseconds; - } while (totalMicroseconds < durationInMicroseconds); - - final int totalNanoseconds = sw.elapsed.inMicroseconds * 1000; - return totalNanoseconds / numberOfCalls; - } - - // Runs warmup phase, runs benchmark and reports result. - Future report() async { - // Warmup for 100 ms. - await measureFor(const Duration(milliseconds: 100)); - - // Run benchmark for 2 seconds. - final double nsPerCall = await measureFor(const Duration(seconds: 2)); - - // Report result. - print('$name(RunTimeRaw): $nsPerCall ns.'); - } -} diff --git a/benchmarks/DartCLIStartup/dart2/DartCLIStartup.dart b/benchmarks/DartCLIStartup/dart2/DartCLIStartup.dart deleted file mode 100644 index 8f98e9b1d2a..00000000000 --- a/benchmarks/DartCLIStartup/dart2/DartCLIStartup.dart +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:io'; - -import 'package:benchmark_harness/benchmark_harness.dart'; - -class DartCLIStartup extends BenchmarkBase { - const DartCLIStartup() : super('DartCLIStartup'); - - // The benchmark code. - @override - void run() { - Process.runSync(Platform.executable, ['help']); - } -} - -void main() { - const DartCLIStartup().report(); -} diff --git a/benchmarks/Dynamic/dart2/Dynamic.dart b/benchmarks/Dynamic/dart2/Dynamic.dart deleted file mode 100644 index 1da925606d3..00000000000 --- a/benchmarks/Dynamic/dart2/Dynamic.dart +++ /dev/null @@ -1,515 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// This benchmark suite measures the overhead of dynamically calling functions -// and closures by calling a set of functions and closures, testing non-dynamic -// calls, calls after casting the function tearoff or closure to dynamic, and -// similarly defined functions and closures except that the parameters and -// return types are all dynamic. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; - -const int kRepeat = 100; - -void main() { - const NonDynamicFunction().report(); - const NonDynamicFunctionOptSkipped().report(); - const NonDynamicFunctionOptProvided().report(); - const NonDynamicFunctionNamedSkipped().report(); - const NonDynamicFunctionNamedProvided().report(); - const NonDynamicClosure().report(); - const NonDynamicClosureOptSkipped().report(); - const NonDynamicClosureOptProvided().report(); - const NonDynamicClosureNamedSkipped().report(); - const NonDynamicClosureNamedProvided().report(); - const DynamicCastFunction().report(); - const DynamicCastFunctionOptSkipped().report(); - const DynamicCastFunctionOptProvided().report(); - const DynamicCastFunctionNamedSkipped().report(); - const DynamicCastFunctionNamedProvided().report(); - const DynamicCastClosure().report(); - const DynamicCastClosureOptSkipped().report(); - const DynamicCastClosureOptProvided().report(); - const DynamicCastClosureNamedSkipped().report(); - const DynamicCastClosureNamedProvided().report(); - const DynamicDefFunction().report(); - const DynamicDefFunctionOptSkipped().report(); - const DynamicDefFunctionOptProvided().report(); - const DynamicDefFunctionNamedSkipped().report(); - const DynamicDefFunctionNamedProvided().report(); - const DynamicDefClosure().report(); - const DynamicDefClosureOptSkipped().report(); - const DynamicDefClosureOptProvided().report(); - const DynamicDefClosureNamedSkipped().report(); - const DynamicDefClosureNamedProvided().report(); - const DynamicClassASingleton().report(); - const DynamicClassBSingleton().report(); - const DynamicClassCFresh().report(); - const DynamicClassDFresh().report(); -} - -@pragma('vm:never-inline') -void f1(String s) {} -@pragma('vm:never-inline') -Function(String) c1 = (String s) => {}; -@pragma('vm:never-inline') -void f2(String s, [String t = 'default']) {} -@pragma('vm:never-inline') -Function(String, [String]) c2 = (String s, [String t = 'default']) => {}; -@pragma('vm:never-inline') -void f3(String s, {String t = 'default'}) {} -@pragma('vm:never-inline') -Function(String, {String t}) c3 = (String s, {String t = 'default'}) => {}; -@pragma('vm:never-inline') -dynamic df1 = f1 as dynamic; -@pragma('vm:never-inline') -dynamic dc1 = c1 as dynamic; -@pragma('vm:never-inline') -dynamic df2 = f2 as dynamic; -@pragma('vm:never-inline') -dynamic dc2 = c2 as dynamic; -@pragma('vm:never-inline') -dynamic df3 = f3 as dynamic; -@pragma('vm:never-inline') -dynamic dc3 = c3 as dynamic; -@pragma('vm:never-inline') -dynamic df1NonCast(dynamic s) {} -@pragma('vm:never-inline') -Function dc1NonCast = (dynamic s) => {}; -@pragma('vm:never-inline') -dynamic df2NonCast(dynamic s, [dynamic t = 'default']) {} -@pragma('vm:never-inline') -Function dc2NonCast = (dynamic s, [dynamic t = 'default']) => {}; -@pragma('vm:never-inline') -dynamic df3NonCast(dynamic s, {dynamic t = 'default'}) {} -@pragma('vm:never-inline') -Function dc3NonCast = (dynamic s, {dynamic t = 'default'}) => {}; - -class A { - const A(); -} - -class B extends A { - const B(); -} - -@pragma('vm:never-inline') -dynamic k = (A a) {}; - -class C { - C(); -} - -class D extends C { - D(); -} - -@pragma('vm:never-inline') -dynamic j = (C c) {}; - -class NonDynamicFunction extends BenchmarkBase { - const NonDynamicFunction() : super('Dynamic.NonDynamicFunction'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - f1(''); - } - } -} - -class NonDynamicClosure extends BenchmarkBase { - const NonDynamicClosure() : super('Dynamic.NonDynamicClosure'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - c1(''); - } - } -} - -class NonDynamicFunctionOptSkipped extends BenchmarkBase { - const NonDynamicFunctionOptSkipped() - : super('Dynamic.NonDynamicFunctionOptSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - f2(''); - } - } -} - -class NonDynamicFunctionOptProvided extends BenchmarkBase { - const NonDynamicFunctionOptProvided() - : super('Dynamic.NonDynamicFunctionOptProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - f2('', ''); - } - } -} - -class NonDynamicFunctionNamedSkipped extends BenchmarkBase { - const NonDynamicFunctionNamedSkipped() - : super('Dynamic.NonDynamicFunctionNamedSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - f3(''); - } - } -} - -class NonDynamicFunctionNamedProvided extends BenchmarkBase { - const NonDynamicFunctionNamedProvided() - : super('Dynamic.NonDynamicFunctionNamedProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - f3('', t: ''); - } - } -} - -class NonDynamicClosureOptSkipped extends BenchmarkBase { - const NonDynamicClosureOptSkipped() - : super('Dynamic.NonDynamicClosureOptSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - c2(''); - } - } -} - -class NonDynamicClosureOptProvided extends BenchmarkBase { - const NonDynamicClosureOptProvided() - : super('Dynamic.NonDynamicClosureOptProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - c2('', ''); - } - } -} - -class NonDynamicClosureNamedSkipped extends BenchmarkBase { - const NonDynamicClosureNamedSkipped() - : super('Dynamic.NonDynamicClosureNamedSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - c3(''); - } - } -} - -class NonDynamicClosureNamedProvided extends BenchmarkBase { - const NonDynamicClosureNamedProvided() - : super('Dynamic.NonDynamicClosureNamedProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - c3('', t: ''); - } - } -} - -class DynamicCastFunction extends BenchmarkBase { - const DynamicCastFunction() : super('Dynamic.DynamicCastFunction'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df1(''); - } - } -} - -class DynamicCastClosure extends BenchmarkBase { - const DynamicCastClosure() : super('Dynamic.DynamicCastClosure'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc1(''); - } - } -} - -class DynamicCastFunctionOptSkipped extends BenchmarkBase { - const DynamicCastFunctionOptSkipped() - : super('Dynamic.DynamicCastFunctionOptSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df2(''); - } - } -} - -class DynamicCastFunctionOptProvided extends BenchmarkBase { - const DynamicCastFunctionOptProvided() - : super('Dynamic.DynamicCastFunctionOptProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df2('', ''); - } - } -} - -class DynamicCastFunctionNamedSkipped extends BenchmarkBase { - const DynamicCastFunctionNamedSkipped() - : super('Dynamic.DynamicCastFunctionNamedSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df3(''); - } - } -} - -class DynamicCastFunctionNamedProvided extends BenchmarkBase { - const DynamicCastFunctionNamedProvided() - : super('Dynamic.DynamicCastFunctionNamedProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df3('', t: ''); - } - } -} - -class DynamicCastClosureOptSkipped extends BenchmarkBase { - const DynamicCastClosureOptSkipped() - : super('Dynamic.DynamicCastClosureOptSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc2(''); - } - } -} - -class DynamicCastClosureOptProvided extends BenchmarkBase { - const DynamicCastClosureOptProvided() - : super('Dynamic.DynamicCastClosureOptProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc2('', ''); - } - } -} - -class DynamicCastClosureNamedSkipped extends BenchmarkBase { - const DynamicCastClosureNamedSkipped() - : super('Dynamic.DynamicCastClosureNamedSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc3(''); - } - } -} - -class DynamicCastClosureNamedProvided extends BenchmarkBase { - const DynamicCastClosureNamedProvided() - : super('Dynamic.DynamicCastClosureNamedProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc3('', t: ''); - } - } -} - -class DynamicDefFunction extends BenchmarkBase { - const DynamicDefFunction() : super('Dynamic.DynamicDefFunction'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df1NonCast(''); - } - } -} - -class DynamicDefClosure extends BenchmarkBase { - const DynamicDefClosure() : super('Dynamic.DynamicDefClosure'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc1NonCast(''); - } - } -} - -class DynamicDefFunctionOptSkipped extends BenchmarkBase { - const DynamicDefFunctionOptSkipped() - : super('Dynamic.DynamicDefFunctionOptSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df2NonCast(''); - } - } -} - -class DynamicDefFunctionOptProvided extends BenchmarkBase { - const DynamicDefFunctionOptProvided() - : super('Dynamic.DynamicDefFunctionOptProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df2NonCast('', ''); - } - } -} - -class DynamicDefFunctionNamedSkipped extends BenchmarkBase { - const DynamicDefFunctionNamedSkipped() - : super('Dynamic.DynamicDefFunctionNamedSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df3NonCast(''); - } - } -} - -class DynamicDefFunctionNamedProvided extends BenchmarkBase { - const DynamicDefFunctionNamedProvided() - : super('Dynamic.DynamicDefFunctionNamedProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - df3NonCast('', t: ''); - } - } -} - -class DynamicDefClosureOptSkipped extends BenchmarkBase { - const DynamicDefClosureOptSkipped() - : super('Dynamic.DynamicDefClosureOptSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc2NonCast(''); - } - } -} - -class DynamicDefClosureOptProvided extends BenchmarkBase { - const DynamicDefClosureOptProvided() - : super('Dynamic.DynamicDefClosureOptProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc2NonCast('', ''); - } - } -} - -class DynamicDefClosureNamedSkipped extends BenchmarkBase { - const DynamicDefClosureNamedSkipped() - : super('Dynamic.DynamicDefClosureNamedSkipped'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc3NonCast(''); - } - } -} - -class DynamicDefClosureNamedProvided extends BenchmarkBase { - const DynamicDefClosureNamedProvided() - : super('Dynamic.DynamicDefClosureNamedProvided'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - dc3NonCast('', t: ''); - } - } -} - -class DynamicClassASingleton extends BenchmarkBase { - final A a; - const DynamicClassASingleton() - : a = const A(), - super('Dynamic.DynamicClassASingleton'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - k(a); - } - } -} - -class DynamicClassBSingleton extends BenchmarkBase { - final B b; - const DynamicClassBSingleton() - : b = const B(), - super('Dynamic.DynamicClassBSingleton'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - k(b); - } - } -} - -class DynamicClassCFresh extends BenchmarkBase { - const DynamicClassCFresh() : super('Dynamic.DynamicClassCFresh'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - j(C()); - } - } -} - -class DynamicClassDFresh extends BenchmarkBase { - const DynamicClassDFresh() : super('Dynamic.DynamicClassDFresh'); - - @override - void run() { - for (int i = 0; i < kRepeat; i++) { - j(D()); - } - } -} diff --git a/benchmarks/EventLoopLatencyJson/dart2/EventLoopLatencyJson.dart b/benchmarks/EventLoopLatencyJson/dart2/EventLoopLatencyJson.dart deleted file mode 100644 index 1b9d5e7fa9d..00000000000 --- a/benchmarks/EventLoopLatencyJson/dart2/EventLoopLatencyJson.dart +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:isolate'; - -import 'json_benchmark.dart'; -import 'latency.dart'; - -Future main() async { - // Start GC pressure from helper isolate. - final exitPort = ReceivePort(); - final exitFuture = exitPort.first; - final isolate = await Isolate.spawn(run, null, onExit: exitPort.sendPort); - - // Measure event loop latency. - const tickDuration = Duration(milliseconds: 1); - const numberOfTicks = 8 * 1000; // min 8 seconds. - final EventLoopLatencyStats stats = await measureEventLoopLatency( - tickDuration, - numberOfTicks, - ); - - // Kill isolate & wait until it's dead. - isolate.kill(priority: Isolate.immediate); - await exitFuture; - - // Report event loop latency statistics. - stats.report('EventLoopLatencyJson'); -} - -void run(dynamic msg) { - while (true) { - JsonRoundTripBenchmark().run(); - } -} diff --git a/benchmarks/EventLoopLatencyJson/dart2/json_benchmark.dart b/benchmarks/EventLoopLatencyJson/dart2/json_benchmark.dart deleted file mode 100644 index e31c534002b..00000000000 --- a/benchmarks/EventLoopLatencyJson/dart2/json_benchmark.dart +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:math'; -import 'dart:convert'; - -class JsonRoundTripBenchmark { - void run() { - final res = json.decode(jsonData); - final out = json.encode(res); - if (out[0] != jsonData[0]) { - throw 'json conversion error'; - } - } -} - -// Builds around 4.5 MB of json data - big enough so the decoded object graph -// does not fit into new space. -final String jsonData = () { - final rnd = Random(42); - dynamic buildTree(int depth) { - final int coin = rnd.nextInt(1000); - if (depth == 0) { - if (coin % 2 == 0) return coin; - return 'foo-$coin'; - } - - if (coin % 2 == 0) { - final map = {}; - final int length = rnd.nextInt(18); - for (int i = 0; i < length; ++i) { - map['bar-$i'] = buildTree(depth - 1); - } - return map; - } else { - final list = []; - final int length = rnd.nextInt(18); - for (int i = 0; i < length; ++i) { - list.add(buildTree(depth - 1)); - } - return list; - } - } - - return json.encode({'data': buildTree(6)}); -}(); diff --git a/benchmarks/EventLoopLatencyJson/dart2/latency.dart b/benchmarks/EventLoopLatencyJson/dart2/latency.dart deleted file mode 100644 index de43d974f79..00000000000 --- a/benchmarks/EventLoopLatencyJson/dart2/latency.dart +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:io'; -import 'dart:math' as math; -import 'dart:typed_data'; - -/// Measures event loop responsiveness. -/// -/// Schedules new timer events, [tickDuration] in the future, and measures how -/// long it takes for these events to actually arrive. -/// -/// Runs [numberOfTicks] times before completing with [EventLoopLatencyStats]. -Future measureEventLoopLatency( - Duration tickDuration, - int numberOfTicks, -) { - final completer = Completer(); - - final tickDurationInUs = tickDuration.inMicroseconds; - final buffer = _TickLatencies(numberOfTicks); - final sw = Stopwatch()..start(); - int lastTimestamp = 0; - - void trigger() { - final int currentTimestamp = sw.elapsedMicroseconds; - - // Every tick we missed to schedule we'll add with difference to when we - // would've scheduled it and when we became responsive again. - bool done = false; - while (!done && lastTimestamp < (currentTimestamp - tickDurationInUs)) { - done = !buffer.add(currentTimestamp - lastTimestamp - tickDurationInUs); - lastTimestamp += tickDurationInUs; - } - - if (!done) { - lastTimestamp = currentTimestamp; - Timer(tickDuration, trigger); - } else { - completer.complete(buffer.makeStats()); - } - } - - Timer(tickDuration, trigger); - - return completer.future; -} - -/// Result of the event loop latency measurement. -class EventLoopLatencyStats { - /// Minimum latency between scheduling a tick and it's arrival (in ms). - final double minLatency; - - /// Average latency between scheduling a tick and it's arrival (in ms). - final double avgLatency; - - /// Maximum latency between scheduling a tick and it's arrival (in ms). - final double maxLatency; - - /// The 50th percentile (median) (in ms). - final double percentile50th; - - /// The 90th percentile (in ms). - final double percentile90th; - - /// The 95th percentile (in ms). - final double percentile95th; - - /// The 99th percentile (in ms). - final double percentile99th; - - /// The maximum RSS of the process. - final int maxRss; - - EventLoopLatencyStats( - this.minLatency, - this.avgLatency, - this.maxLatency, - this.percentile50th, - this.percentile90th, - this.percentile95th, - this.percentile99th, - this.maxRss, - ); - - void report(String name) { - print('$name.Min(RunTimeRaw): $minLatency ms.'); - print('$name.Avg(RunTimeRaw): $avgLatency ms.'); - print('$name.Percentile50(RunTimeRaw): $percentile50th ms.'); - print('$name.Percentile90(RunTimeRaw): $percentile90th ms.'); - print('$name.Percentile95(RunTimeRaw): $percentile95th ms.'); - print('$name.Percentile99(RunTimeRaw): $percentile99th ms.'); - print('$name.Max(RunTimeRaw): $maxLatency ms.'); - print('$name.MaxRss(MemoryUse): $maxRss'); - } -} - -/// Accumulates tick latencies and makes statistics for it. -class _TickLatencies { - final Uint64List _timestamps; - int _index = 0; - - _TickLatencies(int numberOfTicks) : _timestamps = Uint64List(numberOfTicks); - - /// Returns `true` while the buffer has not been filled yet. - bool add(int latencyInUs) { - _timestamps[_index++] = latencyInUs; - return _index < _timestamps.length; - } - - EventLoopLatencyStats makeStats() { - if (_index != _timestamps.length) { - throw 'Buffer has not been fully filled yet.'; - } - - _timestamps.sort(); - final length = _timestamps.length; - final double avg = _timestamps.fold(0, (int a, int b) => a + b) / length; - final int min = _timestamps.fold(0x7fffffffffffffff, math.min); - final int max = _timestamps.fold(0, math.max); - final percentile50th = _timestamps[50 * length ~/ 100]; - final percentile90th = _timestamps[90 * length ~/ 100]; - final percentile95th = _timestamps[95 * length ~/ 100]; - final percentile99th = _timestamps[99 * length ~/ 100]; - - return EventLoopLatencyStats( - min / 1000, - avg / 1000, - max / 1000, - percentile50th / 1000, - percentile90th / 1000, - percentile95th / 1000, - percentile99th / 1000, - ProcessInfo.maxRss, - ); - } -} diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart deleted file mode 100644 index 9c0a37355ce..00000000000 --- a/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:isolate'; - -import 'json_benchmark.dart'; -import 'latency.dart'; - -main() async { - // Start GC pressure from helper isolate. - final exitPort = ReceivePort(); - final exitFuture = exitPort.first; - final isolate = await Isolate.spawn(run, null, onExit: exitPort.sendPort); - - // Measure event loop latency. - const tickDuration = const Duration(milliseconds: 1); - const numberOfTicks = 8 * 1000; // min 8 seconds. - final EventLoopLatencyStats stats = await measureEventLoopLatency( - tickDuration, - numberOfTicks, - ); - - // Kill isolate & wait until it's dead. - isolate.kill(priority: Isolate.immediate); - await exitFuture; - - // Report event loop latency statistics. - stats.report('EventLoopLatencyJson350KB'); -} - -void run(dynamic msg) { - while (true) { - JsonRoundTripBenchmark().run(); - } -} diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart deleted file mode 100644 index ba0994933c3..00000000000 --- a/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:math'; -import 'dart:convert'; - -class JsonRoundTripBenchmark { - void run() { - final res = json.decode(jsonData); - final out = json.encode(res); - if (out[0] != jsonData[0]) { - throw 'json conversion error'; - } - } -} - -// Builds around 350 KB of json data - small enough so the decoded object graph -// fits into new space. -final String jsonData = () { - final rnd = Random(42); - dynamic buildTree(int depth) { - final int coin = rnd.nextInt(1000); - if (depth == 0) { - if (coin % 2 == 0) return coin; - return 'foo-$coin'; - } - - if (coin % 2 == 0) { - final map = {}; - final int length = rnd.nextInt(19); - for (int i = 0; i < length; ++i) { - map['bar-$i'] = buildTree(depth - 1); - } - return map; - } else { - final list = []; - final int length = rnd.nextInt(18); - for (int i = 0; i < length; ++i) { - list.add(buildTree(depth - 1)); - } - return list; - } - } - - return json.encode({'data': buildTree(5)}); -}(); diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart deleted file mode 100644 index de43d974f79..00000000000 --- a/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:io'; -import 'dart:math' as math; -import 'dart:typed_data'; - -/// Measures event loop responsiveness. -/// -/// Schedules new timer events, [tickDuration] in the future, and measures how -/// long it takes for these events to actually arrive. -/// -/// Runs [numberOfTicks] times before completing with [EventLoopLatencyStats]. -Future measureEventLoopLatency( - Duration tickDuration, - int numberOfTicks, -) { - final completer = Completer(); - - final tickDurationInUs = tickDuration.inMicroseconds; - final buffer = _TickLatencies(numberOfTicks); - final sw = Stopwatch()..start(); - int lastTimestamp = 0; - - void trigger() { - final int currentTimestamp = sw.elapsedMicroseconds; - - // Every tick we missed to schedule we'll add with difference to when we - // would've scheduled it and when we became responsive again. - bool done = false; - while (!done && lastTimestamp < (currentTimestamp - tickDurationInUs)) { - done = !buffer.add(currentTimestamp - lastTimestamp - tickDurationInUs); - lastTimestamp += tickDurationInUs; - } - - if (!done) { - lastTimestamp = currentTimestamp; - Timer(tickDuration, trigger); - } else { - completer.complete(buffer.makeStats()); - } - } - - Timer(tickDuration, trigger); - - return completer.future; -} - -/// Result of the event loop latency measurement. -class EventLoopLatencyStats { - /// Minimum latency between scheduling a tick and it's arrival (in ms). - final double minLatency; - - /// Average latency between scheduling a tick and it's arrival (in ms). - final double avgLatency; - - /// Maximum latency between scheduling a tick and it's arrival (in ms). - final double maxLatency; - - /// The 50th percentile (median) (in ms). - final double percentile50th; - - /// The 90th percentile (in ms). - final double percentile90th; - - /// The 95th percentile (in ms). - final double percentile95th; - - /// The 99th percentile (in ms). - final double percentile99th; - - /// The maximum RSS of the process. - final int maxRss; - - EventLoopLatencyStats( - this.minLatency, - this.avgLatency, - this.maxLatency, - this.percentile50th, - this.percentile90th, - this.percentile95th, - this.percentile99th, - this.maxRss, - ); - - void report(String name) { - print('$name.Min(RunTimeRaw): $minLatency ms.'); - print('$name.Avg(RunTimeRaw): $avgLatency ms.'); - print('$name.Percentile50(RunTimeRaw): $percentile50th ms.'); - print('$name.Percentile90(RunTimeRaw): $percentile90th ms.'); - print('$name.Percentile95(RunTimeRaw): $percentile95th ms.'); - print('$name.Percentile99(RunTimeRaw): $percentile99th ms.'); - print('$name.Max(RunTimeRaw): $maxLatency ms.'); - print('$name.MaxRss(MemoryUse): $maxRss'); - } -} - -/// Accumulates tick latencies and makes statistics for it. -class _TickLatencies { - final Uint64List _timestamps; - int _index = 0; - - _TickLatencies(int numberOfTicks) : _timestamps = Uint64List(numberOfTicks); - - /// Returns `true` while the buffer has not been filled yet. - bool add(int latencyInUs) { - _timestamps[_index++] = latencyInUs; - return _index < _timestamps.length; - } - - EventLoopLatencyStats makeStats() { - if (_index != _timestamps.length) { - throw 'Buffer has not been fully filled yet.'; - } - - _timestamps.sort(); - final length = _timestamps.length; - final double avg = _timestamps.fold(0, (int a, int b) => a + b) / length; - final int min = _timestamps.fold(0x7fffffffffffffff, math.min); - final int max = _timestamps.fold(0, math.max); - final percentile50th = _timestamps[50 * length ~/ 100]; - final percentile90th = _timestamps[90 * length ~/ 100]; - final percentile95th = _timestamps[95 * length ~/ 100]; - final percentile99th = _timestamps[99 * length ~/ 100]; - - return EventLoopLatencyStats( - min / 1000, - avg / 1000, - max / 1000, - percentile50th / 1000, - percentile90th / 1000, - percentile95th / 1000, - percentile99th / 1000, - ProcessInfo.maxRss, - ); - } -} diff --git a/benchmarks/EventLoopLatencyRegexp/dart2/EventLoopLatencyRegexp.dart b/benchmarks/EventLoopLatencyRegexp/dart2/EventLoopLatencyRegexp.dart deleted file mode 100644 index 435c8b7f307..00000000000 --- a/benchmarks/EventLoopLatencyRegexp/dart2/EventLoopLatencyRegexp.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:isolate'; - -import 'regexp_benchmark.dart'; -import 'latency.dart'; - -main() async { - final exitPort = ReceivePort(); - final exitFuture = exitPort.first; - final isolate = await Isolate.spawn(run, null, onExit: exitPort.sendPort); - - // Measure event loop latency. - const tickDuration = const Duration(milliseconds: 1); - const numberOfTicks = 8 * 1000; // min 8 seconds. - final EventLoopLatencyStats stats = await measureEventLoopLatency( - tickDuration, - numberOfTicks, - ); - - // Kill isolate & wait until it's dead. - isolate.kill(priority: Isolate.immediate); - await exitFuture; - - // Report event loop latency statistics. - stats.report('EventLoopLatencyRegexp'); -} - -void run(dynamic msg) { - while (true) { - RegexpBenchmark().run(); - } -} diff --git a/benchmarks/EventLoopLatencyRegexp/dart2/latency.dart b/benchmarks/EventLoopLatencyRegexp/dart2/latency.dart deleted file mode 100644 index de43d974f79..00000000000 --- a/benchmarks/EventLoopLatencyRegexp/dart2/latency.dart +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:io'; -import 'dart:math' as math; -import 'dart:typed_data'; - -/// Measures event loop responsiveness. -/// -/// Schedules new timer events, [tickDuration] in the future, and measures how -/// long it takes for these events to actually arrive. -/// -/// Runs [numberOfTicks] times before completing with [EventLoopLatencyStats]. -Future measureEventLoopLatency( - Duration tickDuration, - int numberOfTicks, -) { - final completer = Completer(); - - final tickDurationInUs = tickDuration.inMicroseconds; - final buffer = _TickLatencies(numberOfTicks); - final sw = Stopwatch()..start(); - int lastTimestamp = 0; - - void trigger() { - final int currentTimestamp = sw.elapsedMicroseconds; - - // Every tick we missed to schedule we'll add with difference to when we - // would've scheduled it and when we became responsive again. - bool done = false; - while (!done && lastTimestamp < (currentTimestamp - tickDurationInUs)) { - done = !buffer.add(currentTimestamp - lastTimestamp - tickDurationInUs); - lastTimestamp += tickDurationInUs; - } - - if (!done) { - lastTimestamp = currentTimestamp; - Timer(tickDuration, trigger); - } else { - completer.complete(buffer.makeStats()); - } - } - - Timer(tickDuration, trigger); - - return completer.future; -} - -/// Result of the event loop latency measurement. -class EventLoopLatencyStats { - /// Minimum latency between scheduling a tick and it's arrival (in ms). - final double minLatency; - - /// Average latency between scheduling a tick and it's arrival (in ms). - final double avgLatency; - - /// Maximum latency between scheduling a tick and it's arrival (in ms). - final double maxLatency; - - /// The 50th percentile (median) (in ms). - final double percentile50th; - - /// The 90th percentile (in ms). - final double percentile90th; - - /// The 95th percentile (in ms). - final double percentile95th; - - /// The 99th percentile (in ms). - final double percentile99th; - - /// The maximum RSS of the process. - final int maxRss; - - EventLoopLatencyStats( - this.minLatency, - this.avgLatency, - this.maxLatency, - this.percentile50th, - this.percentile90th, - this.percentile95th, - this.percentile99th, - this.maxRss, - ); - - void report(String name) { - print('$name.Min(RunTimeRaw): $minLatency ms.'); - print('$name.Avg(RunTimeRaw): $avgLatency ms.'); - print('$name.Percentile50(RunTimeRaw): $percentile50th ms.'); - print('$name.Percentile90(RunTimeRaw): $percentile90th ms.'); - print('$name.Percentile95(RunTimeRaw): $percentile95th ms.'); - print('$name.Percentile99(RunTimeRaw): $percentile99th ms.'); - print('$name.Max(RunTimeRaw): $maxLatency ms.'); - print('$name.MaxRss(MemoryUse): $maxRss'); - } -} - -/// Accumulates tick latencies and makes statistics for it. -class _TickLatencies { - final Uint64List _timestamps; - int _index = 0; - - _TickLatencies(int numberOfTicks) : _timestamps = Uint64List(numberOfTicks); - - /// Returns `true` while the buffer has not been filled yet. - bool add(int latencyInUs) { - _timestamps[_index++] = latencyInUs; - return _index < _timestamps.length; - } - - EventLoopLatencyStats makeStats() { - if (_index != _timestamps.length) { - throw 'Buffer has not been fully filled yet.'; - } - - _timestamps.sort(); - final length = _timestamps.length; - final double avg = _timestamps.fold(0, (int a, int b) => a + b) / length; - final int min = _timestamps.fold(0x7fffffffffffffff, math.min); - final int max = _timestamps.fold(0, math.max); - final percentile50th = _timestamps[50 * length ~/ 100]; - final percentile90th = _timestamps[90 * length ~/ 100]; - final percentile95th = _timestamps[95 * length ~/ 100]; - final percentile99th = _timestamps[99 * length ~/ 100]; - - return EventLoopLatencyStats( - min / 1000, - avg / 1000, - max / 1000, - percentile50th / 1000, - percentile90th / 1000, - percentile95th / 1000, - percentile99th / 1000, - ProcessInfo.maxRss, - ); - } -} diff --git a/benchmarks/EventLoopLatencyRegexp/dart2/regexp_benchmark.dart b/benchmarks/EventLoopLatencyRegexp/dart2/regexp_benchmark.dart deleted file mode 100644 index 6047117dd0f..00000000000 --- a/benchmarks/EventLoopLatencyRegexp/dart2/regexp_benchmark.dart +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:math'; -import 'dart:convert'; - -class RegexpBenchmark { - void run() { - final re = RegExp(r'(x+)*y'); - final s = 'x' * 26 + ''; - re.allMatches(s).iterator.moveNext(); - } -} diff --git a/benchmarks/Example/dart2/Example.dart b/benchmarks/Example/dart2/Example.dart deleted file mode 100644 index 30843a26676..00000000000 --- a/benchmarks/Example/dart2/Example.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; - -class Example extends BenchmarkBase { - const Example() : super('Example'); - - // The benchmark code. - @override - void run() {} - - // Not measured setup code executed prior to the benchmark runs. - @override - void setup() {} - - // Not measured teardown code executed after the benchmark runs. - @override - void teardown() {} -} - -void main() { - const Example().report(); -} diff --git a/benchmarks/FfiStruct/dart2/FfiStruct.dart b/benchmarks/FfiStruct/dart2/FfiStruct.dart deleted file mode 100644 index 15bb53ad3a2..00000000000 --- a/benchmarks/FfiStruct/dart2/FfiStruct.dart +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// Micro-benchmark for ffi struct field stores and loads. -// -// Only tests a single field because the FfiMemory benchmark already tests loads -// and stores of different field sizes. - -// @dart=2.9 - -import 'dart:ffi'; - -import 'package:ffi/ffi.dart'; -import 'package:benchmark_harness/benchmark_harness.dart'; - -// -// Struct field store (plus Pointer elementAt and load). -// - -void doStoreInt32(Pointer pointer, int length) { - for (int i = 0; i < length; i++) { - pointer[i].c = 1; - } -} - -// -// Struct field load (plus Pointer elementAt and load). -// - -int doLoadInt32(Pointer pointer, int length) { - int x = 0; - for (int i = 0; i < length; i++) { - x += pointer[i].c; - } - return x; -} - -// -// Benchmark fixture. -// - -// Number of repeats: 1000 -// * CPU: Intel(R) Xeon(R) Gold 6154 -// * Architecture: x64 -// * 150000 - 465000 us (without optimizations) -// * 14 - ??? us (expected with optimizations, on par with typed data) -const N = 1000; - -class FieldLoadStore extends BenchmarkBase { - Pointer pointer; - FieldLoadStore() : super('FfiStruct.FieldLoadStore'); - - @override - void setup() => pointer = calloc(N); - @override - void teardown() => calloc.free(pointer); - - @override - void run() { - doStoreInt32(pointer, N); - final int x = doLoadInt32(pointer, N); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -// -// Main driver. -// - -void main() { - final benchmarks = [() => FieldLoadStore()]; - for (final benchmark in benchmarks) { - benchmark().report(); - } -} - -// -// Test struct. -// -class VeryLargeStruct extends Struct { - @Int8() - int a; - - @Int16() - int b; - - @Int32() - int c; - - @Int64() - int d; - - @Uint8() - int e; - - @Uint16() - int f; - - @Uint32() - int g; - - @Uint64() - int h; - - @IntPtr() - int i; - - @Double() - double j; - - @Float() - double k; - - Pointer parent; - - @IntPtr() - int numChildren; - - Pointer children; - - @Int8() - int smallLastField; -} diff --git a/benchmarks/ForEachLoop/dart2/ForEachLoop.dart b/benchmarks/ForEachLoop/dart2/ForEachLoop.dart deleted file mode 100644 index 222e1a96c9d..00000000000 --- a/benchmarks/ForEachLoop/dart2/ForEachLoop.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; - -class IterationBenchmark extends BenchmarkBase { - List list = List.generate(1000, (i) => i); - var r = 0; - void fn(int i) => r = 123 * i; - IterationBenchmark(name) : super(name); -} - -class ForEach extends IterationBenchmark { - ForEach() : super('ForEachLoop'); - - @override - void run() { - list.forEach(fn); - } -} - -void main() { - ForEach().report(); -} diff --git a/benchmarks/ForInGeneratedLoop/dart2/ForInGeneratedLoop.dart b/benchmarks/ForInGeneratedLoop/dart2/ForInGeneratedLoop.dart deleted file mode 100644 index acf89b5bf4e..00000000000 --- a/benchmarks/ForInGeneratedLoop/dart2/ForInGeneratedLoop.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; - -class IterationBenchmark extends BenchmarkBase { - List list = List.generate(1000, (i) => i); - var r = 0; - void fn(int i) => r = 123 * i; - IterationBenchmark(name) : super(name); -} - -Iterable generateElements(List list) sync* { - for (var i = 0; i < list.length; i++) { - yield list[i]; - } -} - -class ForInGenerated extends IterationBenchmark { - ForInGenerated() : super('ForInGeneratedLoop'); - - @override - void run() { - for (var item in generateElements(list)) { - fn(item); - } - } -} - -void main() { - ForInGenerated().report(); -} diff --git a/benchmarks/ForInLoop/dart2/ForInLoop.dart b/benchmarks/ForInLoop/dart2/ForInLoop.dart deleted file mode 100644 index 857691fa3cc..00000000000 --- a/benchmarks/ForInLoop/dart2/ForInLoop.dart +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; - -class IterationBenchmark extends BenchmarkBase { - List list = List.generate(1000, (i) => i); - var r = 0; - void fn(int i) => r = 123 * i; - IterationBenchmark(name) : super(name); -} - -class ForIn extends IterationBenchmark { - ForIn() : super('ForInLoop'); - - @override - void run() { - for (var item in list) { - fn(item); - } - } -} - -void main() { - ForIn().report(); -} diff --git a/benchmarks/ForLoop/dart2/ForLoop.dart b/benchmarks/ForLoop/dart2/ForLoop.dart deleted file mode 100644 index cd9e9612f27..00000000000 --- a/benchmarks/ForLoop/dart2/ForLoop.dart +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; - -class IterationBenchmark extends BenchmarkBase { - List list = List.generate(1000, (i) => i); - var r = 0; - void fn(int i) => r = 123 * i; - IterationBenchmark(name) : super(name); -} - -class ForLoop extends IterationBenchmark { - ForLoop() : super('ForLoop'); - - @override - void run() { - for (var i = 0; i < list.length; i++) { - fn(list[i]); - } - } -} - -void main() { - ForLoop().report(); -} diff --git a/benchmarks/InstantiateTypeArgs/dart2/InstantiateTypeArgs.dart b/benchmarks/InstantiateTypeArgs/dart2/InstantiateTypeArgs.dart deleted file mode 100644 index d861823bc78..00000000000 --- a/benchmarks/InstantiateTypeArgs/dart2/InstantiateTypeArgs.dart +++ /dev/null @@ -1,3204 +0,0 @@ -// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// This benchmark suite measures the overhead of instantiating type arguments, -// with a particular aim of measuring the overhead of the caching mechanism. - -// @dart=2.9" - -import 'package:benchmark_harness/benchmark_harness.dart'; - -void main() { - const Instantiate1().report(); - const Instantiate5().report(); - const Instantiate10().report(); - const Instantiate100().report(); - const Instantiate1000().report(); -} - -class Instantiate1 extends BenchmarkBase { - const Instantiate1() : super('InstantiateTypeArgs.Instantiate1'); - - // Normalize the cost across the benchmarks by number of instantiations. - @override - void report() => emitter.emit(name, measure() / 1); - - @override - void run() { - D.instantiate(); - } -} - -class Instantiate5 extends BenchmarkBase { - const Instantiate5() : super('InstantiateTypeArgs.Instantiate5'); - - // Normalize the cost across the benchmarks by number of instantiations. - @override - void report() => emitter.emit(name, measure() / 5); - - @override - void run() { - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - } -} - -class Instantiate10 extends BenchmarkBase { - const Instantiate10() : super('InstantiateTypeArgs.Instantiate10'); - - // Normalize the cost across the benchmarks by number of instantiations. - @override - void report() => emitter.emit(name, measure() / 10); - - @override - void run() { - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - } -} - -class Instantiate100 extends BenchmarkBase { - const Instantiate100() : super('InstantiateTypeArgs.Instantiate100'); - - // Normalize the cost across the benchmarks by number of instantiations. - @override - void report() => emitter.emit(name, measure() / 100); - - @override - void run() { - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - } -} - -class Instantiate1000 extends BenchmarkBase { - const Instantiate1000() : super('InstantiateTypeArgs.Instantiate1000'); - - // Normalize the cost across the benchmarks by number of instantiations. - @override - void report() => emitter.emit(name, measure() / 1000); - - @override - void run() { - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - D.instantiate(); - } -} - -@pragma('vm:never-inline') -@pragma('dart2js:never-inline') -void blackhole() => null; - -class D { - @pragma('vm:never-inline') - @pragma('dart2js:never-inline') - static void instantiate() => blackhole>(); -} - -class C0 {} - -class C1 {} - -class C2 {} - -class C3 {} - -class C4 {} - -class C5 {} - -class C6 {} - -class C7 {} - -class C8 {} - -class C9 {} - -class C10 {} - -class C11 {} - -class C12 {} - -class C13 {} - -class C14 {} - -class C15 {} - -class C16 {} - -class C17 {} - -class C18 {} - -class C19 {} - -class C20 {} - -class C21 {} - -class C22 {} - -class C23 {} - -class C24 {} - -class C25 {} - -class C26 {} - -class C27 {} - -class C28 {} - -class C29 {} - -class C30 {} - -class C31 {} - -class C32 {} - -class C33 {} - -class C34 {} - -class C35 {} - -class C36 {} - -class C37 {} - -class C38 {} - -class C39 {} - -class C40 {} - -class C41 {} - -class C42 {} - -class C43 {} - -class C44 {} - -class C45 {} - -class C46 {} - -class C47 {} - -class C48 {} - -class C49 {} - -class C50 {} - -class C51 {} - -class C52 {} - -class C53 {} - -class C54 {} - -class C55 {} - -class C56 {} - -class C57 {} - -class C58 {} - -class C59 {} - -class C60 {} - -class C61 {} - -class C62 {} - -class C63 {} - -class C64 {} - -class C65 {} - -class C66 {} - -class C67 {} - -class C68 {} - -class C69 {} - -class C70 {} - -class C71 {} - -class C72 {} - -class C73 {} - -class C74 {} - -class C75 {} - -class C76 {} - -class C77 {} - -class C78 {} - -class C79 {} - -class C80 {} - -class C81 {} - -class C82 {} - -class C83 {} - -class C84 {} - -class C85 {} - -class C86 {} - -class C87 {} - -class C88 {} - -class C89 {} - -class C90 {} - -class C91 {} - -class C92 {} - -class C93 {} - -class C94 {} - -class C95 {} - -class C96 {} - -class C97 {} - -class C98 {} - -class C99 {} - -class C100 {} - -class C101 {} - -class C102 {} - -class C103 {} - -class C104 {} - -class C105 {} - -class C106 {} - -class C107 {} - -class C108 {} - -class C109 {} - -class C110 {} - -class C111 {} - -class C112 {} - -class C113 {} - -class C114 {} - -class C115 {} - -class C116 {} - -class C117 {} - -class C118 {} - -class C119 {} - -class C120 {} - -class C121 {} - -class C122 {} - -class C123 {} - -class C124 {} - -class C125 {} - -class C126 {} - -class C127 {} - -class C128 {} - -class C129 {} - -class C130 {} - -class C131 {} - -class C132 {} - -class C133 {} - -class C134 {} - -class C135 {} - -class C136 {} - -class C137 {} - -class C138 {} - -class C139 {} - -class C140 {} - -class C141 {} - -class C142 {} - -class C143 {} - -class C144 {} - -class C145 {} - -class C146 {} - -class C147 {} - -class C148 {} - -class C149 {} - -class C150 {} - -class C151 {} - -class C152 {} - -class C153 {} - -class C154 {} - -class C155 {} - -class C156 {} - -class C157 {} - -class C158 {} - -class C159 {} - -class C160 {} - -class C161 {} - -class C162 {} - -class C163 {} - -class C164 {} - -class C165 {} - -class C166 {} - -class C167 {} - -class C168 {} - -class C169 {} - -class C170 {} - -class C171 {} - -class C172 {} - -class C173 {} - -class C174 {} - -class C175 {} - -class C176 {} - -class C177 {} - -class C178 {} - -class C179 {} - -class C180 {} - -class C181 {} - -class C182 {} - -class C183 {} - -class C184 {} - -class C185 {} - -class C186 {} - -class C187 {} - -class C188 {} - -class C189 {} - -class C190 {} - -class C191 {} - -class C192 {} - -class C193 {} - -class C194 {} - -class C195 {} - -class C196 {} - -class C197 {} - -class C198 {} - -class C199 {} - -class C200 {} - -class C201 {} - -class C202 {} - -class C203 {} - -class C204 {} - -class C205 {} - -class C206 {} - -class C207 {} - -class C208 {} - -class C209 {} - -class C210 {} - -class C211 {} - -class C212 {} - -class C213 {} - -class C214 {} - -class C215 {} - -class C216 {} - -class C217 {} - -class C218 {} - -class C219 {} - -class C220 {} - -class C221 {} - -class C222 {} - -class C223 {} - -class C224 {} - -class C225 {} - -class C226 {} - -class C227 {} - -class C228 {} - -class C229 {} - -class C230 {} - -class C231 {} - -class C232 {} - -class C233 {} - -class C234 {} - -class C235 {} - -class C236 {} - -class C237 {} - -class C238 {} - -class C239 {} - -class C240 {} - -class C241 {} - -class C242 {} - -class C243 {} - -class C244 {} - -class C245 {} - -class C246 {} - -class C247 {} - -class C248 {} - -class C249 {} - -class C250 {} - -class C251 {} - -class C252 {} - -class C253 {} - -class C254 {} - -class C255 {} - -class C256 {} - -class C257 {} - -class C258 {} - -class C259 {} - -class C260 {} - -class C261 {} - -class C262 {} - -class C263 {} - -class C264 {} - -class C265 {} - -class C266 {} - -class C267 {} - -class C268 {} - -class C269 {} - -class C270 {} - -class C271 {} - -class C272 {} - -class C273 {} - -class C274 {} - -class C275 {} - -class C276 {} - -class C277 {} - -class C278 {} - -class C279 {} - -class C280 {} - -class C281 {} - -class C282 {} - -class C283 {} - -class C284 {} - -class C285 {} - -class C286 {} - -class C287 {} - -class C288 {} - -class C289 {} - -class C290 {} - -class C291 {} - -class C292 {} - -class C293 {} - -class C294 {} - -class C295 {} - -class C296 {} - -class C297 {} - -class C298 {} - -class C299 {} - -class C300 {} - -class C301 {} - -class C302 {} - -class C303 {} - -class C304 {} - -class C305 {} - -class C306 {} - -class C307 {} - -class C308 {} - -class C309 {} - -class C310 {} - -class C311 {} - -class C312 {} - -class C313 {} - -class C314 {} - -class C315 {} - -class C316 {} - -class C317 {} - -class C318 {} - -class C319 {} - -class C320 {} - -class C321 {} - -class C322 {} - -class C323 {} - -class C324 {} - -class C325 {} - -class C326 {} - -class C327 {} - -class C328 {} - -class C329 {} - -class C330 {} - -class C331 {} - -class C332 {} - -class C333 {} - -class C334 {} - -class C335 {} - -class C336 {} - -class C337 {} - -class C338 {} - -class C339 {} - -class C340 {} - -class C341 {} - -class C342 {} - -class C343 {} - -class C344 {} - -class C345 {} - -class C346 {} - -class C347 {} - -class C348 {} - -class C349 {} - -class C350 {} - -class C351 {} - -class C352 {} - -class C353 {} - -class C354 {} - -class C355 {} - -class C356 {} - -class C357 {} - -class C358 {} - -class C359 {} - -class C360 {} - -class C361 {} - -class C362 {} - -class C363 {} - -class C364 {} - -class C365 {} - -class C366 {} - -class C367 {} - -class C368 {} - -class C369 {} - -class C370 {} - -class C371 {} - -class C372 {} - -class C373 {} - -class C374 {} - -class C375 {} - -class C376 {} - -class C377 {} - -class C378 {} - -class C379 {} - -class C380 {} - -class C381 {} - -class C382 {} - -class C383 {} - -class C384 {} - -class C385 {} - -class C386 {} - -class C387 {} - -class C388 {} - -class C389 {} - -class C390 {} - -class C391 {} - -class C392 {} - -class C393 {} - -class C394 {} - -class C395 {} - -class C396 {} - -class C397 {} - -class C398 {} - -class C399 {} - -class C400 {} - -class C401 {} - -class C402 {} - -class C403 {} - -class C404 {} - -class C405 {} - -class C406 {} - -class C407 {} - -class C408 {} - -class C409 {} - -class C410 {} - -class C411 {} - -class C412 {} - -class C413 {} - -class C414 {} - -class C415 {} - -class C416 {} - -class C417 {} - -class C418 {} - -class C419 {} - -class C420 {} - -class C421 {} - -class C422 {} - -class C423 {} - -class C424 {} - -class C425 {} - -class C426 {} - -class C427 {} - -class C428 {} - -class C429 {} - -class C430 {} - -class C431 {} - -class C432 {} - -class C433 {} - -class C434 {} - -class C435 {} - -class C436 {} - -class C437 {} - -class C438 {} - -class C439 {} - -class C440 {} - -class C441 {} - -class C442 {} - -class C443 {} - -class C444 {} - -class C445 {} - -class C446 {} - -class C447 {} - -class C448 {} - -class C449 {} - -class C450 {} - -class C451 {} - -class C452 {} - -class C453 {} - -class C454 {} - -class C455 {} - -class C456 {} - -class C457 {} - -class C458 {} - -class C459 {} - -class C460 {} - -class C461 {} - -class C462 {} - -class C463 {} - -class C464 {} - -class C465 {} - -class C466 {} - -class C467 {} - -class C468 {} - -class C469 {} - -class C470 {} - -class C471 {} - -class C472 {} - -class C473 {} - -class C474 {} - -class C475 {} - -class C476 {} - -class C477 {} - -class C478 {} - -class C479 {} - -class C480 {} - -class C481 {} - -class C482 {} - -class C483 {} - -class C484 {} - -class C485 {} - -class C486 {} - -class C487 {} - -class C488 {} - -class C489 {} - -class C490 {} - -class C491 {} - -class C492 {} - -class C493 {} - -class C494 {} - -class C495 {} - -class C496 {} - -class C497 {} - -class C498 {} - -class C499 {} - -class C500 {} - -class C501 {} - -class C502 {} - -class C503 {} - -class C504 {} - -class C505 {} - -class C506 {} - -class C507 {} - -class C508 {} - -class C509 {} - -class C510 {} - -class C511 {} - -class C512 {} - -class C513 {} - -class C514 {} - -class C515 {} - -class C516 {} - -class C517 {} - -class C518 {} - -class C519 {} - -class C520 {} - -class C521 {} - -class C522 {} - -class C523 {} - -class C524 {} - -class C525 {} - -class C526 {} - -class C527 {} - -class C528 {} - -class C529 {} - -class C530 {} - -class C531 {} - -class C532 {} - -class C533 {} - -class C534 {} - -class C535 {} - -class C536 {} - -class C537 {} - -class C538 {} - -class C539 {} - -class C540 {} - -class C541 {} - -class C542 {} - -class C543 {} - -class C544 {} - -class C545 {} - -class C546 {} - -class C547 {} - -class C548 {} - -class C549 {} - -class C550 {} - -class C551 {} - -class C552 {} - -class C553 {} - -class C554 {} - -class C555 {} - -class C556 {} - -class C557 {} - -class C558 {} - -class C559 {} - -class C560 {} - -class C561 {} - -class C562 {} - -class C563 {} - -class C564 {} - -class C565 {} - -class C566 {} - -class C567 {} - -class C568 {} - -class C569 {} - -class C570 {} - -class C571 {} - -class C572 {} - -class C573 {} - -class C574 {} - -class C575 {} - -class C576 {} - -class C577 {} - -class C578 {} - -class C579 {} - -class C580 {} - -class C581 {} - -class C582 {} - -class C583 {} - -class C584 {} - -class C585 {} - -class C586 {} - -class C587 {} - -class C588 {} - -class C589 {} - -class C590 {} - -class C591 {} - -class C592 {} - -class C593 {} - -class C594 {} - -class C595 {} - -class C596 {} - -class C597 {} - -class C598 {} - -class C599 {} - -class C600 {} - -class C601 {} - -class C602 {} - -class C603 {} - -class C604 {} - -class C605 {} - -class C606 {} - -class C607 {} - -class C608 {} - -class C609 {} - -class C610 {} - -class C611 {} - -class C612 {} - -class C613 {} - -class C614 {} - -class C615 {} - -class C616 {} - -class C617 {} - -class C618 {} - -class C619 {} - -class C620 {} - -class C621 {} - -class C622 {} - -class C623 {} - -class C624 {} - -class C625 {} - -class C626 {} - -class C627 {} - -class C628 {} - -class C629 {} - -class C630 {} - -class C631 {} - -class C632 {} - -class C633 {} - -class C634 {} - -class C635 {} - -class C636 {} - -class C637 {} - -class C638 {} - -class C639 {} - -class C640 {} - -class C641 {} - -class C642 {} - -class C643 {} - -class C644 {} - -class C645 {} - -class C646 {} - -class C647 {} - -class C648 {} - -class C649 {} - -class C650 {} - -class C651 {} - -class C652 {} - -class C653 {} - -class C654 {} - -class C655 {} - -class C656 {} - -class C657 {} - -class C658 {} - -class C659 {} - -class C660 {} - -class C661 {} - -class C662 {} - -class C663 {} - -class C664 {} - -class C665 {} - -class C666 {} - -class C667 {} - -class C668 {} - -class C669 {} - -class C670 {} - -class C671 {} - -class C672 {} - -class C673 {} - -class C674 {} - -class C675 {} - -class C676 {} - -class C677 {} - -class C678 {} - -class C679 {} - -class C680 {} - -class C681 {} - -class C682 {} - -class C683 {} - -class C684 {} - -class C685 {} - -class C686 {} - -class C687 {} - -class C688 {} - -class C689 {} - -class C690 {} - -class C691 {} - -class C692 {} - -class C693 {} - -class C694 {} - -class C695 {} - -class C696 {} - -class C697 {} - -class C698 {} - -class C699 {} - -class C700 {} - -class C701 {} - -class C702 {} - -class C703 {} - -class C704 {} - -class C705 {} - -class C706 {} - -class C707 {} - -class C708 {} - -class C709 {} - -class C710 {} - -class C711 {} - -class C712 {} - -class C713 {} - -class C714 {} - -class C715 {} - -class C716 {} - -class C717 {} - -class C718 {} - -class C719 {} - -class C720 {} - -class C721 {} - -class C722 {} - -class C723 {} - -class C724 {} - -class C725 {} - -class C726 {} - -class C727 {} - -class C728 {} - -class C729 {} - -class C730 {} - -class C731 {} - -class C732 {} - -class C733 {} - -class C734 {} - -class C735 {} - -class C736 {} - -class C737 {} - -class C738 {} - -class C739 {} - -class C740 {} - -class C741 {} - -class C742 {} - -class C743 {} - -class C744 {} - -class C745 {} - -class C746 {} - -class C747 {} - -class C748 {} - -class C749 {} - -class C750 {} - -class C751 {} - -class C752 {} - -class C753 {} - -class C754 {} - -class C755 {} - -class C756 {} - -class C757 {} - -class C758 {} - -class C759 {} - -class C760 {} - -class C761 {} - -class C762 {} - -class C763 {} - -class C764 {} - -class C765 {} - -class C766 {} - -class C767 {} - -class C768 {} - -class C769 {} - -class C770 {} - -class C771 {} - -class C772 {} - -class C773 {} - -class C774 {} - -class C775 {} - -class C776 {} - -class C777 {} - -class C778 {} - -class C779 {} - -class C780 {} - -class C781 {} - -class C782 {} - -class C783 {} - -class C784 {} - -class C785 {} - -class C786 {} - -class C787 {} - -class C788 {} - -class C789 {} - -class C790 {} - -class C791 {} - -class C792 {} - -class C793 {} - -class C794 {} - -class C795 {} - -class C796 {} - -class C797 {} - -class C798 {} - -class C799 {} - -class C800 {} - -class C801 {} - -class C802 {} - -class C803 {} - -class C804 {} - -class C805 {} - -class C806 {} - -class C807 {} - -class C808 {} - -class C809 {} - -class C810 {} - -class C811 {} - -class C812 {} - -class C813 {} - -class C814 {} - -class C815 {} - -class C816 {} - -class C817 {} - -class C818 {} - -class C819 {} - -class C820 {} - -class C821 {} - -class C822 {} - -class C823 {} - -class C824 {} - -class C825 {} - -class C826 {} - -class C827 {} - -class C828 {} - -class C829 {} - -class C830 {} - -class C831 {} - -class C832 {} - -class C833 {} - -class C834 {} - -class C835 {} - -class C836 {} - -class C837 {} - -class C838 {} - -class C839 {} - -class C840 {} - -class C841 {} - -class C842 {} - -class C843 {} - -class C844 {} - -class C845 {} - -class C846 {} - -class C847 {} - -class C848 {} - -class C849 {} - -class C850 {} - -class C851 {} - -class C852 {} - -class C853 {} - -class C854 {} - -class C855 {} - -class C856 {} - -class C857 {} - -class C858 {} - -class C859 {} - -class C860 {} - -class C861 {} - -class C862 {} - -class C863 {} - -class C864 {} - -class C865 {} - -class C866 {} - -class C867 {} - -class C868 {} - -class C869 {} - -class C870 {} - -class C871 {} - -class C872 {} - -class C873 {} - -class C874 {} - -class C875 {} - -class C876 {} - -class C877 {} - -class C878 {} - -class C879 {} - -class C880 {} - -class C881 {} - -class C882 {} - -class C883 {} - -class C884 {} - -class C885 {} - -class C886 {} - -class C887 {} - -class C888 {} - -class C889 {} - -class C890 {} - -class C891 {} - -class C892 {} - -class C893 {} - -class C894 {} - -class C895 {} - -class C896 {} - -class C897 {} - -class C898 {} - -class C899 {} - -class C900 {} - -class C901 {} - -class C902 {} - -class C903 {} - -class C904 {} - -class C905 {} - -class C906 {} - -class C907 {} - -class C908 {} - -class C909 {} - -class C910 {} - -class C911 {} - -class C912 {} - -class C913 {} - -class C914 {} - -class C915 {} - -class C916 {} - -class C917 {} - -class C918 {} - -class C919 {} - -class C920 {} - -class C921 {} - -class C922 {} - -class C923 {} - -class C924 {} - -class C925 {} - -class C926 {} - -class C927 {} - -class C928 {} - -class C929 {} - -class C930 {} - -class C931 {} - -class C932 {} - -class C933 {} - -class C934 {} - -class C935 {} - -class C936 {} - -class C937 {} - -class C938 {} - -class C939 {} - -class C940 {} - -class C941 {} - -class C942 {} - -class C943 {} - -class C944 {} - -class C945 {} - -class C946 {} - -class C947 {} - -class C948 {} - -class C949 {} - -class C950 {} - -class C951 {} - -class C952 {} - -class C953 {} - -class C954 {} - -class C955 {} - -class C956 {} - -class C957 {} - -class C958 {} - -class C959 {} - -class C960 {} - -class C961 {} - -class C962 {} - -class C963 {} - -class C964 {} - -class C965 {} - -class C966 {} - -class C967 {} - -class C968 {} - -class C969 {} - -class C970 {} - -class C971 {} - -class C972 {} - -class C973 {} - -class C974 {} - -class C975 {} - -class C976 {} - -class C977 {} - -class C978 {} - -class C979 {} - -class C980 {} - -class C981 {} - -class C982 {} - -class C983 {} - -class C984 {} - -class C985 {} - -class C986 {} - -class C987 {} - -class C988 {} - -class C989 {} - -class C990 {} - -class C991 {} - -class C992 {} - -class C993 {} - -class C994 {} - -class C995 {} - -class C996 {} - -class C997 {} - -class C998 {} - -class C999 {} diff --git a/benchmarks/IntegerSetLookup/dart2/IntegerSetLookup.dart b/benchmarks/IntegerSetLookup/dart2/IntegerSetLookup.dart deleted file mode 100644 index 351530493fe..00000000000 --- a/benchmarks/IntegerSetLookup/dart2/IntegerSetLookup.dart +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// Benchmark for https://github.com/dart-lang/sdk/issues/48641. -// -// Measures the average time needed for a lookup in Sets of integers. - -// @dart=2.9 - -import 'dart:math'; -import 'dart:collection'; -import 'package:benchmark_harness/benchmark_harness.dart'; - -class SetBenchmark extends BenchmarkBase { - SetBenchmark(String name, this.mySet) : super(name); - - final Set mySet; - - @override - void run() { - mySet.contains(123456789); - } -} - -void main() { - final list = [ - for (int i = 0; i < 14790; i++) (i + 1) * 0x10000000 + 123456789, - ]; - - final r = Random(); - final randomList = List.generate(14790, (_) => r.nextInt(1 << 31)); - - final benchmarks = [ - () => SetBenchmark("IntegerSetLookup.DefaultHashSet", {...list}), - () => - SetBenchmark("IntegerSetLookup.HashSet", HashSet()..addAll(list)), - () => - SetBenchmark("IntegerSetLookup.DefaultHashSet_Random", {...randomList}), - () => SetBenchmark( - "IntegerSetLookup.HashSet_Random", - HashSet()..addAll(randomList), - ), - ]; - for (final benchmark in benchmarks) { - benchmark().report(); - } -} diff --git a/benchmarks/Isolate/dart2/Isolate.dart b/benchmarks/Isolate/dart2/Isolate.dart deleted file mode 100644 index cfc31d93a9f..00000000000 --- a/benchmarks/Isolate/dart2/Isolate.dart +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:isolate'; -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart'; -import 'package:meta/meta.dart'; - -class SendReceiveBytes extends AsyncBenchmarkBase { - SendReceiveBytes( - String name, { - @required this.size, - @required this.useTransferable, - }) : super(name); - - @override - Future run() async { - await helper.run(); - } - - @override - Future setup() async { - helper = SendReceiveHelper(size, useTransferable: useTransferable); - await helper.setup(); - } - - @override - Future teardown() async { - await helper.finalize(); - } - - final bool useTransferable; - final int size; - SendReceiveHelper helper; -} - -class StartMessage { - final SendPort sendPort; - final bool useTransferable; - final int size; - - StartMessage(this.sendPort, this.useTransferable, this.size); -} - -// Measures how long sending and receiving of [size]-length Uint8List takes. -class SendReceiveHelper { - SendReceiveHelper(this.size, {@required this.useTransferable}); - - Future setup() async { - data = Uint8List(size); - - port = ReceivePort(); - inbox = StreamIterator(port); - workerCompleted = Completer(); - workerExitedPort = - ReceivePort()..listen((_) => workerCompleted.complete(true)); - worker = await Isolate.spawn( - isolate, - StartMessage(port.sendPort, useTransferable, size), - onExit: workerExitedPort.sendPort, - ); - await inbox.moveNext(); - outbox = inbox.current; - } - - Future finalize() async { - outbox.send(null); - await workerCompleted.future; - workerExitedPort.close(); - port.close(); - } - - // Send data to worker, wait for an answer. - Future run() async { - outbox.send(packageList(data, useTransferable)); - await inbox.moveNext(); - final received = inbox.current; - if (useTransferable) { - final TransferableTypedData transferable = received; - transferable.materialize(); - } - } - - Uint8List data; - ReceivePort port; - StreamIterator inbox; - SendPort outbox; - Isolate worker; - Completer workerCompleted; - ReceivePort workerExitedPort; - final int size; - final bool useTransferable; -} - -Object packageList(Uint8List data, bool useTransferable) => - useTransferable ? TransferableTypedData.fromList([data]) : data; - -Future isolate(StartMessage startMessage) async { - final port = ReceivePort(); - final inbox = StreamIterator(port); - final data = Uint8List.view(Uint8List(startMessage.size).buffer); - - startMessage.sendPort.send(port.sendPort); - while (true) { - await inbox.moveNext(); - final received = inbox.current; - if (received == null) { - break; - } - if (startMessage.useTransferable) { - final TransferableTypedData transferable = received; - transferable.materialize(); - } - startMessage.sendPort.send(packageList(data, startMessage.useTransferable)); - } - port.close(); -} - -class SizeName { - const SizeName(this.size, this.name); - - final int size; - final String name; -} - -const List sizes = [ - SizeName(1 * 1024, '1KB'), - SizeName(10 * 1024, '10KB'), - SizeName(100 * 1024, '100KB'), - SizeName(1 * 1024 * 1024, '1MB'), - SizeName(10 * 1024 * 1024, '10MB'), - SizeName(100 * 1024 * 1024, '100MB'), -]; - -Future main() async { - for (final sizeName in sizes) { - await SendReceiveBytes( - 'Isolate.SendReceiveBytes${sizeName.name}', - size: sizeName.size, - useTransferable: false, - ).report(); - await SendReceiveBytes( - 'Isolate.SendReceiveBytesTransferable${sizeName.name}', - size: sizeName.size, - useTransferable: true, - ).report(); - } -} diff --git a/benchmarks/IsolateBaseOverhead/dart2/IsolateBaseOverhead.dart b/benchmarks/IsolateBaseOverhead/dart2/IsolateBaseOverhead.dart deleted file mode 100644 index 5d9fe03ac8e..00000000000 --- a/benchmarks/IsolateBaseOverhead/dart2/IsolateBaseOverhead.dart +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'dart:async'; -import 'dart:io'; -import 'dart:isolate'; - -const int count = 10000; - -// The benchmark will spawn a long chain of isolates, keeping all of them -// alive until the last one which measures Rss at that point (i.e. when all -// isolates are alive), thereby getting a good estimate of memory-overhead per -// isolate. -void main() async { - final onDone = ReceivePort(); - final lastIsolatePort = ReceivePort(); - final startRss = ProcessInfo.currentRss; - final startUs = DateTime.now().microsecondsSinceEpoch; - await Isolate.spawn( - worker, - WorkerInfo(count, lastIsolatePort.sendPort), - onExit: onDone.sendPort, - ); - final result = await lastIsolatePort.first as List; - final lastIsolateRss = result[0] as int; - final lastIsolateUs = result[1] as int; - await onDone.first; - final doneUs = DateTime.now().microsecondsSinceEpoch; - - final averageMemoryUsageInKB = (lastIsolateRss - startRss) / count / 1024; - final averageStartLatencyInUs = (lastIsolateUs - startUs) / count; - final averageFinishLatencyInUs = (doneUs - startUs) / count; - - print('IsolateBaseOverhead.Rss(MemoryUse): $averageMemoryUsageInKB'); - print( - 'IsolateBaseOverhead.StartLatency(Latency): $averageStartLatencyInUs us.', - ); - print( - 'IsolateBaseOverhead.FinishLatency(Latency): $averageFinishLatencyInUs us.', - ); -} - -class WorkerInfo { - final int id; - final SendPort result; - - WorkerInfo(this.id, this.result); -} - -Future worker(WorkerInfo workerInfo) async { - if (workerInfo.id == 1) { - workerInfo.result.send([ - ProcessInfo.currentRss, - DateTime.now().microsecondsSinceEpoch, - ]); - return; - } - final onExit = ReceivePort(); - await Isolate.spawn( - worker, - WorkerInfo(workerInfo.id - 1, workerInfo.result), - onExit: onExit.sendPort, - ); - await onExit.first; -} diff --git a/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart b/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart deleted file mode 100644 index 4af3028cfec..00000000000 --- a/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'dart:async'; -import 'dart:io'; -import 'dart:isolate'; -import 'dart:math'; - -import 'package:expect/expect.dart'; - -// Implements recursive summation via tail calls: -// fib(n) => n <= 1 ? 1 -// : fib(n-1) + fib(n-2); -Future fibonacciRecursive(List args) async { - final SendPort port = args[0]; - final n = args[1]; - if (n <= 1) { - port.send(1); - return; - } - final left = ReceivePort(); - final right = ReceivePort(); - await Future.wait([ - Isolate.spawn(fibonacciRecursive, [left.sendPort, n - 1]), - Isolate.spawn(fibonacciRecursive, [right.sendPort, n - 2]), - ]); - final results = await Future.wait([left.first, right.first]); - port.send(results[0] + results[1]); -} - -Future main() async { - final rpWarmup = ReceivePort(); - final rpRun = ReceivePort(); - final int nWarmup = 17; // enough runs to trigger optimized compilation - final int nWarmupFactorial = 2584; - // Runs for about 8 seconds. - final int n = 21; - final int nFactorial = 17711; - final beforeRss = ProcessInfo.currentRss; - - int maxRss = beforeRss; - final rssTimer = Timer.periodic(const Duration(milliseconds: 10), (_) { - maxRss = max(ProcessInfo.currentRss, maxRss); - }); - - final watch = Stopwatch(); - watch.start(); - - // Warm up code by running a couple iterations in the main isolate. - await Isolate.spawn(fibonacciRecursive, [rpWarmup.sendPort, nWarmup]); - Expect.equals(nWarmupFactorial, await rpWarmup.first); - - final warmup = watch.elapsedMicroseconds; - - await Isolate.spawn(fibonacciRecursive, [rpRun.sendPort, n]); - Expect.equals(nFactorial, await rpRun.first); - - final done = watch.elapsedMicroseconds; - - print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done - warmup} us.'); - print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss - beforeRss}'); - rssTimer.cancel(); -} diff --git a/benchmarks/IsolateJson/dart2/IsolateJson.dart b/benchmarks/IsolateJson/dart2/IsolateJson.dart deleted file mode 100644 index 44981b517be..00000000000 --- a/benchmarks/IsolateJson/dart2/IsolateJson.dart +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; -import 'dart:isolate'; -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart' show BenchmarkBase; -import 'package:meta/meta.dart'; - -class JsonDecodingBenchmark { - JsonDecodingBenchmark( - this.name, { - @required this.sample, - @required this.numTasks, - @required this.useSendAndExit, - }); - - Future report() async { - final stopwatch = Stopwatch()..start(); - // Benchmark harness counts 10 iterations as one. - for (int i = 0; i < 10; i++) { - final decodedFutures = []; - for (int i = 0; i < numTasks; i++) { - decodedFutures.add(decodeJson(useSendAndExit, sample)); - } - await Future.wait(decodedFutures); - } - - print('$name(RunTime): ${stopwatch.elapsedMicroseconds} us.'); - } - - final String name; - final Uint8List sample; - final int numTasks; - final bool useSendAndExit; -} - -Uint8List createSampleJson(final size) { - final list = List.generate(size, (i) => i); - final map = {}; - for (int i = 0; i < size; i++) { - map['$i'] = list; - } - return utf8.encode(json.encode(map)); -} - -class JsonDecodeRequest { - final bool useSendAndExit; - final SendPort sendPort; - final Uint8List encodedJson; - const JsonDecodeRequest(this.useSendAndExit, this.sendPort, this.encodedJson); -} - -Future decodeJson(bool useSendAndExit, Uint8List encodedJson) async { - final port = ReceivePort(); - final inbox = StreamIterator(port); - final completer = Completer(); - final workerExitedPort = RawReceivePort((v) { - completer.complete(true); - }); - final workerErroredPort = RawReceivePort((v) { - stderr.writeln('worker errored out $v'); - completer.completeError(true); - }); - await Isolate.spawn( - jsonDecodingIsolate, - JsonDecodeRequest(useSendAndExit, port.sendPort, encodedJson), - onError: workerErroredPort.sendPort, - onExit: workerExitedPort.sendPort, - ); - await completer.future; - workerExitedPort.close(); - workerErroredPort.close(); - await inbox.moveNext(); - final decodedJson = inbox.current; - port.close(); - return decodedJson; -} - -Future jsonDecodingIsolate(JsonDecodeRequest request) async { - final result = json.decode(utf8.decode(request.encodedJson)); - if (request.useSendAndExit) { - Isolate.exit(request.sendPort, result); - } else { - request.sendPort.send(result); - } -} - -class SyncJsonDecodingBenchmark extends BenchmarkBase { - SyncJsonDecodingBenchmark( - String name, { - @required this.sample, - @required this.iterations, - }) : super(name); - - @override - void run() { - int l = 0; - for (int i = 0; i < iterations; i++) { - final Map map = json.decode(utf8.decode(sample)); - l += map.length; - } - assert(l > 0); - } - - final Uint8List sample; - final int iterations; -} - -class BenchmarkConfig { - BenchmarkConfig(this.suffix, this.sample); - - final String suffix; - final Uint8List sample; -} - -Future main() async { - final jsonString = - File('benchmarks/IsolateJson/dart2/sample.json').readAsStringSync(); - final json250KB = utf8.encode(jsonString); // 294356 bytes - final decoded = json.decode(utf8.decode(json250KB)); - final decoded1MB = { - '1': decoded['1'], - '2': decoded['1'], - '3': decoded['1'], - '4': decoded['1'], - }; - final json1MB = utf8.encode(json.encode(decoded1MB)); // 1177397 bytes - decoded['1'] = (decoded['1'] as List).sublist(0, 200); - final json100KB = utf8.encode(json.encode(decoded)); // 104685 bytes - decoded['1'] = (decoded['1'] as List).sublist(0, 100); - final json50KB = utf8.encode(json.encode(decoded)); // 51760 bytes - - final configs = [ - BenchmarkConfig('50KB', json50KB), - BenchmarkConfig('100KB', json100KB), - BenchmarkConfig('250KB', json250KB), - BenchmarkConfig('1MB', json1MB), - ]; - - for (final config in configs) { - for (final iterations in [1, 4]) { - await JsonDecodingBenchmark( - 'IsolateJson.Decode${config.suffix}x$iterations', - useSendAndExit: false, - sample: config.sample, - numTasks: iterations, - ).report(); - await JsonDecodingBenchmark( - 'IsolateJson.SendAndExit_Decode${config.suffix}x$iterations', - useSendAndExit: true, - sample: config.sample, - numTasks: iterations, - ).report(); - SyncJsonDecodingBenchmark( - 'IsolateJson.SyncDecode${config.suffix}x$iterations', - sample: config.sample, - iterations: iterations, - ).report(); - } - } -} diff --git a/benchmarks/IsolateJson/dart2/sample.json b/benchmarks/IsolateJson/dart2/sample.json deleted file mode 100644 index 8d3888c202e..00000000000 --- a/benchmarks/IsolateJson/dart2/sample.json +++ /dev/null @@ -1 +0,0 @@ -{"1":[{"1":{"1":"https://images.pexels.com/photos/733416/pexels-photo-733416.jpeg?cs=srgb&dl=animal-dog-pet-733416.jpg&fm=jpg","3":4608,"4":3456},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQw3eEZzgfnJWrfcDcwVIMy_Y1V5XoFESHax7oIlPzSQxJ-9s4o4A","3":200,"4":149},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dog/","3":"Dog images · Pexels · Free Stock Photos","4":"You can find photos of bulldogs, retrievers, beagles and of course puppies.","10":"SguaQKdRqRdlsC"},"5":{"1":"lLLVuSKOKaBoUui"}},{"1":{"1":"http://www.petmd.com/sites/default/files/Dogs-and-vomiting.jpg","3":590,"4":428},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRTC2-E8GsGxryTokj2Djx33PcWpZAMYjiQRoIDS31Ux-ENHEWH","3":200,"4":144},"3":{"1":"PetMD","2":"https://www.petmd.com/dog/conditions/digestive/different-types-dog-vomit-and-what-they-indicate","3":"Different Types of Dog Vomit, and What They Indicate | petMD","4":"Different Types of Dog Vomit, and What They Indicate","10":"rgVRJtKOVXpdLe"},"5":{"1":"xUEbAsVXOsAMkMO"}},{"1":{"1":"https://images.pexels.com/photos/356378/pexels-photo-356378.jpeg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcToY88EZcEUA-UgqGCQVzuvR-8YxpK8RzNKMdd4KyeleCu35qyw","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dog/","3":"Dog images · Pexels · Free Stock Photos","4":"Free stock photo of animal, dog, pet, cute","10":"WFheUvWgXjwXtD"},"5":{"1":"prHPnfIfXBtFhXY"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2016/09/dogs-catching-treats-fotos-frei-schnauze-christian-vieler-66-57e8d9d0ec7ee__880.jpg","3":880,"4":660},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTr_sMZE8eDNndt5ttEAqacKcA-7IgQ0naBGd3A9XVG1GCIWdjj","3":200,"4":149},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/dogs-catching-treats-fotos-frei-schnauze-christian-vieler/","3":"Hilarious Expressions Of Dogs Trying To Catch Treats In Mid ...","4":"Dog Catching Treat","10":"hCBhQWwnqCrhel"},"5":{"1":"QalunmBgihmCcmj"}},{"1":{"1":"https://i.ytimg.com/vi/GruPNmCb-fQ/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYVG0JeW7ISz-4OcZ0CiUb0AE3cni6IzuGPYVIbJoAccAM2Umx","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=GruPNmCb-fQ","3":"dogs pictures of dogs","4":"","10":"MJJqMJlsVluLXc"},"5":{"1":"iMAXrPRULaMbSKm"},"7":{"1":{"11":{"1":"dogs pictures of dogs","2":"dogs barking, dogs 101, dogs mating, dogs howling, dogs who fail at being dogs, dogs and babies, dogs funny, dogs talking, dogs annoying cats with their frie...","3":"0:55","4":"149947","5":"1439251200000","6":"lifestyle","7":"505","8":"16"}}}},{"1":{"1":"https://i2-prod.mirror.co.uk/incoming/article9769854.ece/ALTERNATES/s615/PROD-Mixed-breed-lab-cross-8-week-old-puppy-in-farm-yard-near-Cochrane-AlbertajpgED.jpg","3":615,"4":409},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQqOXnBZYPgzFX8sgcA1iTrixxTbt15sDmyqN1Sy07IXB4acmbM","3":200,"4":133},"3":{"1":"Irish Mirror","2":"https://www.irishmirror.ie/news/world-news/facts-secret-life-of-dogs-9769971","3":"20 amazing dog facts as you watch Secret Life of Dogs series ...","4":"Mixed breed (lab cross) 8-week old puppy in farm","10":"pRFceHyATKdlWr"},"5":{"1":"pNVdrhPrtToqnQq"}},{"1":{"1":"https://images.pexels.com/photos/36477/dogs-batons-play-bite.jpg?auto=compress&cs=tinysrgb&h=350","3":712,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSrHgf1GKr5sPjRAytMGs5xrzQ4akViEXH5sPlgs3wGKv4IiFVY9A","3":200,"4":98},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dogs/","3":"1000+ Great Dogs Photos · Pexels · Free Stock Photos","4":"White Short Coat Dog","10":"kVfxtLWgXLSNXO"},"5":{"1":"IArTKYCDEkFNdQJ"}},{"1":{"1":"https://s.abcnews.com/images/US/160825_vod_orig_historyofdogs_16x9_992.jpg","3":992,"4":558},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSiS1BpxgmU8dZtUcZM9ZhCLH0MVGioF9jOuVeSUeKJorZqblc6Zw","3":200,"4":112},"3":{"1":"ABC News - Go.com","2":"https://abcnews.go.com/Lifestyle/history-dogs-pets/story?id=41671149","3":"The History of Dogs as Pets - ABC News","4":"buffering","10":"qPlCWSIdyKBbrM"},"5":{"1":"fXDVNQwDhIpuOwD"}},{"1":{"1":"https://media.mnn.com/assets/images/2013/10/Corgeek.jpg","3":900,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTtIZicNvg3fENA9X_vbniL40lcfwe7ioZJ6YulS0GmFe6GfGXI1A","3":200,"4":133},"3":{"1":"Mother Nature Network","2":"https://www.mnn.com/family/pets/stories/31-photos-of-dogs-wearing-glasses","3":"29 photos of dogs wearing glasses | MNN - Mother Nature Network","4":"Corgeek wearing thick-rimmed glasses","10":"lSHpPWQpaPISjU"},"5":{"1":"GYKvLpLqDGPFJXg"}},{"1":{"1":"https://static.scientificamerican.com/sciam/cache/file/B7943D3A-35D3-4D27-906280F095578EC2.jpg","3":320,"4":320},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSNCsn1AuroUrSnWm7f1Wykc9ROorMxkSXPHY-AVOOgV6L-0N0T","3":200,"4":200},"3":{"1":"Scientific American","2":"https://www.scientificamerican.com/article/the-origin-of-dogs/","3":"The Origin of Dogs - Scientific American","4":"","10":"fxsACuFxGdCjOi"},"5":{"1":"hugEXJRCUBEtjsd"}},{"1":{"1":"https://cdn.psychologytoday.com/sites/default/files/styles/image-article_inline_full/public/field_blog_entry_images/2018-03/sandeephanda.jpg?itok=iXHqSFgZ","3":639,"4":430},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSFEOQ3smXMSwFXqUvEr1vJ5x21ciMWO0gAiGNpRCvg5rhwxDkD","3":200,"4":134},"3":{"1":"Psychology Today","2":"https://www.psychologytoday.com/us/blog/canine-corner/201803/are-there-some-truths-behind-isle-dogs","3":"Are There Some Truths Behind 'Isle of Dogs'? | Psychology Today","4":"SandeepHanda photo - Creative Commons License CC0","10":"bagMKHtgcbRaDB"},"5":{"1":"modfWdcGLNxQAyJ"}},{"1":{"1":"https://www.healthline.com/hlcmsresource/images/Dog-Breeds-Health-Problems/3180-Pug_green_grass-732x549-thumbnail.jpg","3":732,"4":549},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9fyeRFN6y6AUMwe_0vQvP7mCIf5iurFZrTAcei1CQlN2gfwqrig","3":200,"4":149},"3":{"1":"Healthline","2":"https://www.healthline.com/health/dog-breeds-and-health-issues","3":"12 Common Dog Breeds and Their Health Issues","4":"","10":"JhFfVvGodohGEK"},"5":{"1":"oeXrDfFoklVmGtq"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2016/09/dogs-catching-treats-fotos-frei-schnauze-christian-vieler-4-57e8d08f5fc8f__880.jpg","3":880,"4":1173},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTHMV0D4vwUH9TK5xMCanXYzWgaKAefyVB33Ehg06OK31Nwqm9g","3":149,"4":200},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/dogs-catching-treats-fotos-frei-schnauze-christian-vieler/","3":"Hilarious Expressions Of Dogs Trying To Catch Treats In Mid ...","4":"Dog Catching Treat","10":"FyEKtGxRPjfnKO"},"5":{"1":"hDUbUkdaJjjbuqP"}},{"1":{"1":"http://www.dogbreedslist.info/uploads/allimg/dog-pictures/Beagle-1.jpg","3":400,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQox7_4om515DH4IbD8Prr6Sbnq30OFIJjaqMeHIjlsLy7nvUfX5w","3":200,"4":149},"3":{"1":"Dog Breeds List","2":"http://www.dogbreedslist.info/all-dog-breeds/","3":"All Dog Breeds, All Dog Types, All Dog List Names & Pictures","4":"Beagle","10":"bfNEoguPVtbtLd"},"5":{"1":"CnXysoILLwWyCtD"}},{"1":{"1":"https://media1.fdncms.com/stranger/imager/u/original/25231124/dog-stock-photos-9.jpg","3":700,"4":508},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIvUyRcVTeIRW3TJQfwIJAZhoPB4cr_OKWIc0zVIZoEv63MkmHYA","3":200,"4":144},"3":{"1":"The Stranger","2":"https://www.thestranger.com/slog/2017/06/21/25230993/drunk-man-killed-by-a-pack-of-dogs","3":"Drunk Man Eaten Alive By a Pack of Dogs - Slog - The Stranger","4":"This is a free stock photo of a dog. If you want to see the","10":"IgSvbNIltWEEwd"},"5":{"1":"cYgCBcJcaUhVfax"}},{"1":{"1":"https://i.dailymail.co.uk/i/pix/2017/04/24/16/3F907F8A00000578-4440672-image-m-84_1493049047546.jpg","3":470,"4":518},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSncPu-uh8ZvUmH5pHt44DzkScX-iiFVHHSJPZXJpob0NJKtJ9ylg","3":181,"4":200},"3":{"1":"Daily Mail","2":"https://www.dailymail.co.uk/sciencetech/article-4440672/Map-shows-breeds-dogs-evolved-globe.html","3":"Map shows how breeds of dogs evolved around the globe | Daily ...","4":"The researchers have spent year sequencing the genomes of dogs, including golden retrievers (pictured","10":"IexeHMwHeSSRNj"},"5":{"1":"pAbGXlIdKaoFpeq"}},{"1":{"1":"https://www.telegraph.co.uk/content/dam/Pets/spark/royal-canin/rc-7_dogs.jpg?imwidth=450","3":480,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQNFuT_iGr6VUtsCWNJPagVAQbwr38Hf60DH71_60-P6Q43IccrbA","3":200,"4":124},"3":{"1":"The Telegraph","2":"https://www.telegraph.co.uk/pets/essentials/seven-types-of-dog/","3":"The 7 types of dog","4":"7 types of dog","10":"NMEuhtiMRpwOpI"},"5":{"1":"OfowkXWGdhgIatC"}},{"1":{"1":"https://amp.businessinsider.com/images/5ab514477708e97acc0f0cc9-750-562.jpg","3":750,"4":562},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDknn1s15Hxsl9Ia0VWFreeM2JQ3j_1quuxN2gct1k2UNs-mKjDg","3":200,"4":149},"3":{"1":"Business Insider","2":"https://www.businessinsider.com/isle-of-dogs-movie-i-love-dogs-tweets-reactions-2018-3","3":"Isle of Dogs' is pronounced 'I love dogs' and people are ...","4":"Isle of Dogs movie Wes Anderson Fox Searchlight Pictures","10":"iXypfDeEmRoQat"},"5":{"1":"HTpoQgGnRUeWIXc"}},{"1":{"1":"https://images.agoramedia.com/everydayhealth/gcms/Best-and-Worst-Dog-Breeds-for-Allergies-06-1440x810.jpg?width=730","3":730,"4":410},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_xRgFtXHo-nTTWZhLeZWReUdLNv2kLjUdVqneQsYHTG1Ql83_","3":200,"4":112},"3":{"1":"Everyday Health","2":"https://www.everydayhealth.com/allergy-pictures/best-and-worst-dog-breeds-for-people-with-allergies.aspx","3":"Best and Worst Dog Breeds for People With Allergies ...","4":"Best: The Bichon Frise and Labradoodle Are Great Hypoallergenic Dogs","10":"ehAAXIHECfjrGJ"},"5":{"1":"wdVCorFRYSIGGKr"}},{"1":{"1":"http://www.insidedogsworld.com/wp-content/uploads/2016/03/Dog-Pictures.jpg","3":1600,"4":1092},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSwCLO0IhU0gJtCtO7z_oe2TqADEtc_s57hjyxba-omx7Q524EF","3":200,"4":136},"3":{"1":"Inside Dogs World","2":"http://www.insidedogsworld.com/doggy-dna-learn-how-to-determine-your-dogs-breed/","3":"Doggy DNA - Learn How to Determine Your Dog's Breed - Inside ...","4":"Doggy DNA – Learn How to Determine Your Dog's Breed","10":"uuCtKfTFMKWRRC"},"5":{"1":"EQBsTFvYFYLhfah"}},{"1":{"1":"https://www.planwallpaper.com/static/images/3e9c5ad3af07e573b0e74bdb0a1dce3e.jpg","3":1600,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQkrUyVlOK9hkIWgIDkh4os23NxTTL925HmkGHa0KhalcOy29at","3":200,"4":149},"3":{"1":"planwallpaper.com","2":"https://www.planwallpaper.com/pictures-dogs","3":"Nice pictures of different types of dogs including, Labrador ...","4":"Pictures of Dogs","10":"mklFCiXFYyFYkP"},"5":{"1":"FlnaWswreHfokNn"}},{"1":{"1":"https://pbs.twimg.com/profile_images/962016398657536000/ygoklDXh_400x400.jpg","3":400,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR45pwTGoDqneOjTgTvSA6rhDEkmhprQi08wkhcR3qIW3vLNSZuaQ","3":200,"4":200},"3":{"1":"Twitter","2":"https://twitter.com/isleofdogsmovie","3":"Isle of Dogs (@isleofdogsmovie) | Twitter","4":"Isle of Dogs","10":"COMSuLFTKJfFRc"},"5":{"1":"NXbmwUJVPlrVJDq"}},{"1":{"1":"https://www.telegraph.co.uk/content/dam/news/2017/10/16/alamy_trans_NvBQzQNjv4Bq_yHCl97T-pmmS890d_-lMLlnpmZnLOvn-dZ00jolDcU.png?imwidth=450","3":480,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpabtx60ZO8jN9PviVFQHSNuHQE4Hohoo2nEZG0wDm7WRLYtH2cw","3":200,"4":124},"3":{"1":"The Telegraph","2":"https://www.telegraph.co.uk/news/2017/10/16/california-first-us-state-bans-sale-dogs-puppy-mills/","3":"California to be first US state that bans sale of dogs from ...","4":"Follow the author of this article","10":"AbJpjbQJvFhEOp"},"5":{"1":"aLDaXCkraGQRXJj"}},{"1":{"1":"https://images.pexels.com/photos/850602/pexels-photo-850602.jpeg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR13B6xa4L-1BX-lW6akzUcZGSagbZX-aZpI4ynZ8H8EBufjEgk","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dogs/","3":"1000+ Great Dogs Photos · Pexels · Free Stock Photos","4":"Photography of Three Dogs Looking Up","10":"bCleKSaPgwaqsp"},"5":{"1":"HqvqIYprPdbySFd"}},{"1":{"1":"https://g77v3827gg2notadhhw9pew7-wpengine.netdna-ssl.com/wp-content/uploads/2017/02/side-effects-of-dog-seizures_canna-pet-e1488305138683-1024x675.jpg","3":1024,"4":675},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcROkfK9Akkc6FPWW6QbNvnIZIvYc2jh6J-FiFW6i6cVMFWGs6CS","3":200,"4":131},"3":{"1":"Canna-Pet","2":"https://canna-pet.com/side-effects-dog-seizures/","3":"Side Effects of Dog Seizures | Canna-Pet","4":"When your dog suffers from a seizure, things can get scary. Unless you have prior experience dealing ...","10":"CuWqYDalAItEAC"},"5":{"1":"ShraFjJEYLkJTuM"}},{"1":{"1":"https://gfnc1kn6pi-flywheel.netdna-ssl.com/wp-content/uploads/2016/12/beagle.jpg","3":2734,"4":1503},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3tZYFHIKJ_a_DdRQ7iwKDgbdovkQxiOGePEGb4LO0jA1ZiFL9Yg","3":200,"4":109},"3":{"1":"The Happy Puppy Site","2":"https://thehappypuppysite.com/dog-breed-groups/","3":"Different Types Of Dogs: The Dog Breed Groups Explained","4":"","10":"PjvrqgbFNJbdVk"},"5":{"1":"yatyBgWoyTxLMtP"}},{"1":{"1":"http://images6.fanpop.com/image/photos/33200000/cute-puppy-dogs-33237869-1024-768.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRo2A34saU-H_gKu_2IRv3s1V9iDvCSj8GCu5UPEglrHBh4Kp8qEw","3":200,"4":149},"3":{"1":"Fanpop","2":"http://www.fanpop.com/clubs/dogs/images/33237869/title/cute-puppy-photo","3":"Dogs images cute puppy HD wallpaper and background photos ...","4":"Dogs images cute puppy HD wallpaper and background photos","10":"egPjrYYHpdvPme"},"5":{"1":"EEICyeYkCvYwXLO"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/dog-how-to-select-your-new-best-friend-thinkstock99062463.jpg","3":2048,"4":1536},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTRIvpifkq9hrRGj8H8kia131DoNNU69BJD13Vbh0RS1Fyc3eir","3":200,"4":149},"3":{"1":"Petfinder","2":"https://www.petfinder.com/pet-adoption/dog-adoption/type-dog-adoption/","3":"What Kind of Dog is Right for You? | Petfinder","4":"How to Select Your New Best Friend","10":"hvnHFcgyhBEWKo"},"5":{"1":"XvtJWtvCTtTUGUE"}},{"1":{"1":"https://phz8.petinsurance.com/-/media/all-phz-images/2016-images-850/painful_condition_dogs850.jpg","3":850,"4":477},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSUaqtvYYYQKvrfvutDGGaiNT8vb-nmbFhs4svZisNCJutwkT7s","3":200,"4":112},"3":{"1":"Pet HealthZone - Nationwide Pet Insurance","2":"https://phz8.petinsurance.com/ownership-adoption/pet-ownership/pet-behavior/secret-language-of-dogs","3":"Secret Language of Dogs","4":"5 of the Most Painful Conditions for Dogs Infographic","10":"WvTABueqaEenmO"},"5":{"1":"RnDslGiNkbYImvT"}},{"1":{"1":"https://boygeniusreport.files.wordpress.com/2016/11/puppy-dog.jpg?quality=98&strip=all&w=782","3":782,"4":529},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRtCG9yitxng6vXipfsQ9Ix4kKetdMjZqC6SEsLsaWiUXpvn2DoWw","3":200,"4":135},"3":{"1":"BGR.com","2":"https://bgr.com/2018/04/30/dog-food-recall-illness-2018-australia/","3":"Pet food maker whose food sickened dozens of dogs will now ...","4":"dog food recall","10":"CnJIxRQSgtHwrK"},"5":{"1":"efIduFqGkIJUaKO"}},{"1":{"1":"https://s3.amazonaws.com/cdn-origin-etr.akc.org/wp-content/uploads/2017/11/14144545/Afghan-Hound.981631440-400x267.jpg","3":400,"4":267},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSEOtJxduRSati0Da8xMEWEu-XkITbsLG9p7HRWqPdom6wq7ZpSbQ","3":200,"4":133},"3":{"1":"American Kennel Club","2":"https://www.akc.org/dog-breeds/largest-dog-breeds/","3":"Largest Dog Breeds – American Kennel Club","4":"Afghan Hound","10":"fYEbncuQaxwNql"},"5":{"1":"YAgwGCfdvHlIfNe"}},{"1":{"1":"http://www.termcoord.eu/wp-content/uploads/2014/06/Dog1-300x300.jpg","3":300,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyYEIkXsOSEDtelosTsFUwgOvndtVRU05csD-Xls1ih23V6xkIQg","3":200,"4":200},"3":{"1":"TermCoord","2":"http://termcoord.eu/2014/06/language-dogs/","3":"The Language of Dogs - Terminology Coordination Unit [DGTRAD ...","4":"Whether you're a cat or dog person, or even a… turtle person, knowing what your pet is trying to say ...","10":"tqEScIlTpwyTGg"},"5":{"1":"IltOuDYoEvnfdNp"}},{"1":{"1":"https://2.bp.blogspot.com/-fZNgK0_TgOc/WK82Vp7SKoI/AAAAAAAAClQ/Wp-ptafLniU4Qrq21v9_-GceX1wScZklgCLcB/s1600/dog-puppy-info.jpg","3":736,"4":1128},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTef30plTwjVco7_6sYT-1MGDCo13ArTTkrRDKgdS5RY7nHabQ9ZA","3":130,"4":200},"3":{"1":"Companion Animal Psychology","2":"https://www.companionanimalpsychology.com/p/all-about-dogs.html","3":"Companion Animal Psychology: All About Dogs","4":"Essential info for owners of dogs, like this cute mixed-breed puppy","10":"tCihFexyfCGTyK"},"5":{"1":"DXPnPecpPDdVSyL"}},{"1":{"1":"http://discovermagazine.com/~/media/Images/Issues/2016/December/DSC-A1216_01.jpg","3":1200,"4":1054},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcToOmuh2CoCK5KII7an_lwwd9QvDUXWFv-o5C3ZtTpIMkkxeIFMkg","3":200,"4":175},"3":{"1":"Discover Magazine","2":"http://discovermagazine.com/2016/dec/the-origins-of-dogs","3":"The Origins of Dogs | DiscoverMagazine.com","4":"William Zuback/Discover","10":"SYCeycfBKoolRt"},"5":{"1":"qMPWqKXVSSnvyAS"}},{"1":{"1":"https://www.petmd.com/sites/default/files/excess-protein-urine-dogs.jpg","3":590,"4":428},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTXDZ8HeQFcHunFGNZn9x_lNaMnT4RNp6musZ8E9uWkt2E8L97HCA","3":200,"4":144},"3":{"1":"PetMD","2":"https://www.petmd.com/dog/conditions/urinary/c_multi_proteinuria","3":"Excess Protein in the Urine of Dogs | petMD","4":"Excess Protein in the Urine of Dogs","10":"FYHbeBBukLntuP"},"5":{"1":"CyfaFOmUMgNnQab"}},{"1":{"1":"https://timedotcom.files.wordpress.com/2017/04/world-of-dogs-06.jpg","3":2560,"4":1828},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQC_HWVgXvr-oaEoiPhQCqlakG4CjOJhOFpO0iz1offaVxC8saPTA","3":200,"4":142},"3":{"1":"Time","2":"http://time.com/4775436/how-smart-is-a-dog-really/","3":"A Dog's Brain: Inside the Complex Canine Mind | Time","4":"Isabella, a 14 year-old Pomeranian photographed in New York, NY on April","10":"efLLIMPDyVtVHU"},"5":{"1":"muCEStXmFieFAXV"}},{"1":{"1":"https://www.indiewire.com/wp-content/uploads/2018/02/05-isle-of-dogs-1-w710-h473.jpg?w=710","3":710,"4":473},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQZ5l8kHahaV_4Y9pHXud4pFwy4dG1DSUy5Pq5L_BBUcKCRyvo6og","3":200,"4":133},"3":{"1":"IndieWire","2":"https://www.indiewire.com/2018/02/wes-anderson-isle-of-dogs-soundtrack-kurosawa-seven-samurai-1201933682/","3":"Wes Anderson's 'Isle of Dogs' Official Soundtrack Revealed ...","4":"\"Isle of Dogs\"","10":"KIxyaUxLUheWqo"},"5":{"1":"cmMlrpWYBWodKUt"}},{"1":{"1":"https://doggonesafe.com/Resources/Pictures/close%20up%20on%20two%20dogs%20mouths.jpg","3":1600,"4":1066},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSvSC5m7zvD0WLFNVWXbdtql8yUsa_QODDOSoLBxzmueG463wVm","3":200,"4":133},"3":{"1":"Doggone Safe","2":"https://doggonesafe.com/event-2017914","3":"Doggone Safe - Learn How To Effectively Manage Groups of Dogs ...","4":"Learn How To Effectively & Safely Manage Groups of Dogs In an Off Leash Environment","10":"bMtNLBtEdWoimM"},"5":{"1":"kIroRbkLSsunErY"}},{"1":{"1":"https://ksassets.timeincuk.net/wp/uploads/sites/55/2018/03/Isle-Of-Dogs-Wes-Anderson-920x584.jpg","3":920,"4":584},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRBtFZgJ_dAq_1mez2TICKHMQF8A5Y_H2TOdjTbhKwI5gJpalpj6Q","3":200,"4":126},"3":{"1":"NME.com","2":"https://www.nme.com/news/film/wes-anderson-isle-of-dogs-accused-of-cultural-appropriation-2270903","3":"Wes Anderson's new film 'Isle Of Dogs' accused of cultural ...","4":"Wes Anderson's 'Isle Of Dogs' Credit: Press/Fox Searchlight","10":"WeFAhcACgFtWre"},"5":{"1":"WSjvUvHYAcYxlOV"}},{"1":{"1":"https://www.southwalesargus.co.uk/resources/images/8069964/?type=responsive-gallery-fullscreen","3":1200,"4":853},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSPbAFtbuGs_brIhYaS5WeL1XS3d_-0cobmR3emTzDOfFIAOYcYKA","3":200,"4":142},"3":{"1":"South Wales Argus","2":"https://www.southwalesargus.co.uk/news/16354776.dog-of-the-week-special-urgent-homes-needed-for-influx-of-dogs/","3":"DOG OF THE WEEK SPECIAL: Urgent homes needed for influx of ...","4":"DOG OF THE WEEK SPECIAL: Urgent homes needed for influx of dogs","10":"iPPwrCQrHtUwnj"},"5":{"1":"ThnKbyBJkSonlPR"}},{"1":{"1":"http://images1.fanpop.com/images/photos/1900000/Puppy-3-dogs-1993798-1024-768.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRT4zOhw6SIGsnLaqC8XG3RQTwx1iEJKT98YoiDDYgCKr2dGWhrjw","3":200,"4":149},"3":{"1":"Fanpop","2":"http://www.fanpop.com/clubs/dogs/images/1993798/title/puppy-3-wallpaper","3":"Dogs images Puppy! <3 HD wallpaper and background photos ...","4":"Dogs images Puppy! <3 HD wallpaper and background photos","10":"FIfPysmQXPcEoO"},"5":{"1":"llqdQJtxyVThaQa"}},{"1":{"1":"https://media.newyorker.com/photos/591dccd9394e5718feb60feb/master/w_767,c_limit/NY-Hot-Dogs-23126.jpg","3":767,"4":767},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0ZnFlsmwesaIXdETZY5aoM2LRKo3hoDcKy2mvnKVFW66j1iIY","3":200,"4":200},"3":{"1":"The New Yorker","2":"https://www.newyorker.com/culture/photo-booth/the-resplendent-humanity-of-dogs-up-close","3":"The Resplendent Humanity of Dogs, Up Close | The New Yorker","4":"18","10":"obsdwjSMvUjVkE"},"5":{"1":"dVCLBRwfFqBXWCd"}},{"1":{"1":"https://www.smartcompany.com.au/content/uploads/2015/02/labrador-600.jpg","3":600,"4":476},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1oCXNLUiN5QKs8ocIR9-B6Wp8mEu0ZJthZWrIy4_xQ5X2yVyD0A","3":200,"4":158},"3":{"1":"SmartCompany","2":"https://www.smartcompany.com.au/business-advice/legal/dog-food-brand-purina-accused-of-killing-thousands-of-dogs-in-us-lawsuit/","3":"Dog food brand Purina accused of killing thousands of dogs in ...","4":"Dog food brand Purina accused of killing thousands of dogs in US lawsuit","10":"mAroiaYTrBkUhJ"},"5":{"1":"QclmbLEPrprbuAQ"}},{"1":{"1":"https://pmcvariety.files.wordpress.com/2018/03/klaus-dyba_dog1-e1521434052499.jpg?w=1000&h=563&crop=1","3":1000,"4":563},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQmpK4KAjLAgKsfHh3h4UgzoEWBZs8dkmcbPUkNwKCR3BQvVL8E","3":200,"4":112},"3":{"1":"Variety","2":"https://variety.com/2018/digital/news/isle-of-dogs-photo-filters-vsco-1202729830/","3":"Isle of Dogs Photo Filters Launched by VSCO App – Variety","4":"VSCO Isle of Dogs","10":"yIIQcRMdUELwFK"},"5":{"1":"DRwSIJbAJufcUvs"}},{"1":{"1":"https://stylesatlife.com/wp-content/uploads/2015/11/Types-of-Dogs-1.jpg","3":500,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtD7XVGiTjOyaMLl6KKi1zgmt4Ksg3FqjyjYxTHpFfBlTf8Cp9gw","3":200,"4":160},"3":{"1":"Styles At Life","2":"https://stylesatlife.com/articles/types-of-dogs/","3":"25 Different Types of Dogs with Origins and Pictures | Styles ...","4":"Types of Dogs 1","10":"tOJvdJJkojReHe"},"5":{"1":"gHncbSaPleDBLkS"}},{"1":{"1":"https://static.independent.co.uk/s3fs-public/thumbnails/image/2018/10/17/11/pitbull-terrier.jpg","3":1885,"4":1414},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTFkzuvCcwzalnLPoz_B_GFuVJbWdy1gU18WCNntvEx6723UA_4","3":200,"4":149},"3":{"1":"The Independent","2":"https://www.independent.co.uk/topic/Dogs","3":"Dogs - latest news, breaking stories and comment - The ...","4":"Hundreds of dogs killed unnecessarily due to misguided laws, say MPs. '","10":"dBrfyemnfqPUHL"},"5":{"1":"bDcFFScCEXkdfSE"}},{"1":{"1":"https://housemydog.com/blog/wp-content/uploads/2017/01/cute-bulldog-smiling-sleeping-dog-narcoleptic-frenchiebutt-millo-2.jpg","3":605,"4":605},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR5p9r1S8m6p7LxLVWdn7SIZ7pOxT4LjWxyXmGICcPsSkzdDBC7","3":200,"4":200},"3":{"1":"HouseMyDog","2":"https://housemydog.com/blog/12-photos-of-dogs-and-people-hugging","3":"12 Photos Of Dogs And People Hugging | HouseMyDog Blog","4":"12 Photos of Dogs And People Hugging","10":"BfHFdqIsgdXnvg"},"5":{"1":"hGdfYXJjwBWNhiH"}},{"1":{"1":"http://blog.petmeds.com/wp-content/uploads/2015/12/Dogs-scoot-for-a-variety-of-reasons-720x539.jpg","3":720,"4":539},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJY4S4-LSPElx1yw0jWJlAVtb4nVk_k1iZWjh5nSFLtfqw7eHJ","3":200,"4":149},"3":{"1":"Pet Meds","2":"https://blog.petmeds.com/ask-the-vet/dogs-that-scoot/","3":"The five W's of dogs that scoot","4":"Pug puppy scoots in the grass","10":"QuSVvhWOfrLOve"},"5":{"1":"NSiUBmiSPsgmdbh"}},{"1":{"1":"https://www.petdoors.com/blog/wp-content/uploads/2016/11/20160608_162336.jpg","3":3445,"4":2134},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRxitlvtt6iIOW0ARaZPUAD3TDnUbICzdaNH-MolMhbNFPkcjDLgQ","3":200,"4":124},"3":{"1":"Pet Doors","2":"https://www.petdoors.com/blog/weird-sleeping-positions-of-dogs/","3":"8 Weird Sleeping Positions of Dogs and What They May Mean","4":"tonks sleeping on side","10":"ugFixbcaUjflVW"},"5":{"1":"XjfrAbWCSueIFVj"}},{"1":{"1":"https://www.rover.com/blog/wp-content/uploads/2014/08/puppy-in-popcorn-bucket-960x540.jpg","3":960,"4":540},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRkb9P2Sc2YYiAQL-svc-HhRTTRRaoRXmDmCPAhlZXEnxUnC_S_DQ","3":200,"4":112},"3":{"1":"Rover.com","2":"https://www.rover.com/blog/list-of-dog-movies/","3":"Dog best friends in film: A list of dog movies","4":"Puppy in popcorn - list of dog movies","10":"KAbDbSDgeRWRSh"},"5":{"1":"qHkIgRTfksaBNLN"}},{"1":{"1":"http://www.beliefnet.com/columnists/islaminamerica/files/2015/07/puppy-300x200.jpg","3":300,"4":200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTFpW2rKLGgXz98fq6kA1ZfOpppZFQCS7DiWYZc_E9yw92k8g4W","3":200,"4":133},"3":{"1":"Beliefnet","2":"http://www.beliefnet.com/columnists/islaminamerica/2015/08/01/of-dogs-faith-and-islam/","3":"Of Dogs, Faith and Islam\" - Islam In America","4":"The Qu'ran doesn't label dogs as untouchable (in fact, there's quite a nice vignette of the Prophet ...","10":"wTWCnjOjpgPeqC"},"5":{"1":"pcaojGbsRwBSnlg"}},{"1":{"1":"https://nationalpostcom.files.wordpress.com/2018/08/pot-dog-1.png","3":1000,"4":750},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSMHAQsQ9v5uiLxRcYzACMQaeYlASsLgRCdf7FQCR7dvd-dq5BpXg","3":200,"4":149},"3":{"1":"National Post","2":"https://nationalpost.com/cannabis/veterinarian-warns-dog-owners-on-cannabis-risks-saying-cases-come-in-weekly","3":"Vet warns of increase in cases of dogs suffering from ...","4":"Aspen, a Husky who was taken to emergency after consuming a presumed cannabis product at a public ...","10":"ifbKSyggOghgok"},"5":{"1":"QYLiYKmNioYcMKF"}},{"1":{"1":"https://cdn1-www.dogtime.com/assets/uploads/2015/07/file_26979_column_grumpy-dog-earl.jpg","3":399,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSUhbiihu3jBahI_uxXELM5b39I1Jfgys43_yg2wcvB9u16gV1d_w","3":199,"4":200},"3":{"1":"Dogtime","2":"https://dogtime.com/trending/26979-meet-grumpy-dog-the-grumpy-cat-of-dogs","3":"Meet Grumpy Dog: The Grumpy Cat Of Dogs - Dogtime","4":"Meet Grumpy Dog: The Grumpy Cat Of Dogs","10":"tkDKCPGmDEwsLp"},"5":{"1":"pKJSXPQvDqeoJwt"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/147083304-dogs-home-alone-all-day-632x475.jpg","3":632,"4":475},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQqYHACs2dhbqxtHrQkONT2kpL_266Yyz1Nr8Qx47NjM54tWY_rvg","3":200,"4":150},"3":{"1":"Petfinder","2":"https://www.petfinder.com/dogs/dog-care/dogs-home-alone-all-day/","3":"Dogs Who Are Home Alone All Day | Petfinder","4":"Dogs Who Are Home Alone All Day","10":"aRApkLsryspgvr"},"5":{"1":"pTnBSeEyxfvAcdB"}},{"1":{"1":"https://www.what-dog.net/Images/faces2/scroll008.jpg","3":600,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQeRO06aRgpx_cMscbjMIB1xhtYZOQ1x2lr4JL1zyw1V9dtVQlfzA","3":200,"4":200},"3":{"2":"https://www.what-dog.net/","3":"What is your dog?","4":"","10":"DVhcDonMkEPCvc"},"5":{"1":"XuuDRWfawIEwkmT"}},{"1":{"1":"https://usercontent1.hubstatic.com/7968066.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSLTxAtZayQYGIp-mX48YfSTdZ1uZBbCG7C13VvSipFeWpT1XLS0g","3":200,"4":149},"3":{"1":"PetHelpful","2":"https://pethelpful.com/dogs/The-Advantages-and-Disadvantages-of-Having-a-Dog","3":"The Advantages and Disadvantages of Having a Dog | PetHelpful","4":"","10":"PHAjVhJQgBreCM"},"5":{"1":"KGclwXLTfhffRbE"}},{"1":{"1":"http://www.picturesofdogs.co.uk/pictures/poodle1%20copy.jpg","3":450,"4":345},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTEd2IqP7IPgmOq72NfG6kBOSML6oNcKU1RP7GUVcXFhygTyCFiVw","3":200,"4":153},"3":{"2":"http://www.picturesofdogs.co.uk/","3":"Pictures of Dogs- Pictures Please","4":"Pictures of Dogs","10":"MjeyCYwFOOXIiD"},"5":{"1":"IqdKtHYxoHDvClM"}},{"1":{"1":"https://i.ytimg.com/vi/jJGItJSU1aM/hqdefault.jpg","3":480,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT8f2B8tVeG9hrinolfzSFeYqiSgGiK6-HYtLlrUhVDg7YTT-wJgQ","3":200,"4":149},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=jJGItJSU1aM","3":"Different Breeds of Dogs","4":"Different Breeds of Dogs","10":"fJgMXsPToLMMdP"},"5":{"1":"kwiHRNPInpkbNNL"},"7":{"1":{"11":{"1":"Different Breeds of Dogs","2":"A slide show of a different variety of Dogs","3":"4:15","4":"34165","5":"1218844800000","6":"Natasha Eyden","7":"79","8":"20"}}}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2018/2-dogs.jpg","3":1920,"4":1755},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLa94Qb6HvKe7C-Ubn0jxrHHlSj4eemB7DwvDrv6RVjt8Oa7tgSQ","3":200,"4":182},"3":{"1":"Phys.org","2":"https://phys.org/news/2018-10-evidence-dogs-accompanying-humans-europe.html","3":"Evidence of dogs accompanying humans to Europe during Neolithic","4":"Credit: CC0 Public Domain","10":"UlWSqGAKobFJKA"},"5":{"1":"UILGEmQFEFoVAsn"}},{"1":{"1":"https://pixel.nymag.com/imgs/daily/vulture/2018/03/14/14-isle-of-dogs.w1200.h630.jpg","3":1200,"4":630},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTnStaY7_N_-4QdrCvyM4lL2lhbyva5oq2XffsaNXNFpAs9vGM0","3":200,"4":105},"3":{"1":"Vulture","2":"http://www.vulture.com/2018/03/watch-this-video-introducing-the-dogs-of-isle-of-dogs.html","3":"Watch This Short Film Introducing the Dogs of Isle of Dogs","4":"","10":"mypNHTvWswtCOc"},"5":{"1":"lDgHnJMPFmMtKJf"}},{"1":{"1":"https://i.pinimg.com/736x/f5/7e/00/f57e00306f3183cc39fa919fec41418b--teddy-bears-teddy-bear-dogs.jpg","3":736,"4":1169},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJCqloOub7mjnQN642eZl5b6--cZA9bCIbF2djsa8iu49b4ZCGWg","3":125,"4":200},"3":{"1":"Pinterest","2":"https://www.pinterest.com/pin/436075176396371066/","3":"Pin by Debbie Smith on A ! ADORABLE | Pinterest | Dog, Animal ...","4":"Pin by Debbie Smith on A ! ADORABLE | Pinterest | Dog, Animal and Puppys","10":"hKSgDyvRymSNOK"},"5":{"1":"nrkXvuIUqRUTJTg"}},{"1":{"1":"https://s.abcnews.com/images/Video/GTY_dog_day_jef_160826_16x9_992.jpg","3":992,"4":558},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRbFXNRTNnAXdUs_QDs214jo1FjE8COPoo4G-_P9qWw9ARNwuyb","3":200,"4":112},"3":{"1":"ABC News - Go.com","2":"https://abcnews.go.com/Lifestyle/history-dogs-pets/story?id=41671149","3":"The History of Dogs as Pets - ABC News","4":"","10":"dQNaxWEwmsEgUC"},"5":{"1":"bjrXwgWopfKXlyE"}},{"1":{"1":"https://ichef.bbci.co.uk/news/660/cpsprodpb/B45D/production/_100637164_dogs_fox.jpg","3":660,"4":371},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT91tSrZ8U2pYvHbjt0zlEMAUJqWF4MaUv1eQ_LUQljDRpWygA7ag","3":200,"4":112},"3":{"1":"BBC","2":"https://www.bbc.co.uk/news/entertainment-arts-43595611","3":"Why Isle of Dogs is no shaggy dog story - BBC News","4":"Isle of Dogs","10":"adxyWuDDKnakQS"},"5":{"1":"NSqbjoIcrHjXDQU"}},{"1":{"1":"http://bdfjade.com/data/out/65/5719631-picture-of-dogs.jpg","3":600,"4":507},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTghCT-JVAlT-a7YLqHgjsIUDd22U7pV1NlFp2lA9z2XY4PrdZncQ","3":200,"4":168},"3":{"1":"BDFjade","2":"http://bdfjade.com/picture-of-dogs.html","3":"Picture Of Dogs - BDFjade","4":"Dogs Background Galleries » PT-5719631 FHDQ Pictures","10":"TtaqJYSoykOYvn"},"5":{"1":"lHKIsGwxfrMSwTa"}},{"1":{"1":"https://www.stayathomemum.com.au/cache/860x380-0/wp-content/uploads/2017/01/photo-1513549054-cb3611a004fe.jpg","3":574,"4":380},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTlsQHCHS3pVNI4Jm3Z7tcezteSPg9GGv676JZLJBEsNjYvYJHBaQ","3":200,"4":132},"3":{"1":"Stay at Home Mum","2":"https://www.stayathomemum.com.au/houseandhome/pets-and-pet-food/10-breeds-of-dogs-suited-to-family-life-and-children/","3":"10 Breeds Of Dogs Suited To Family Life And Children","4":"","10":"vmDYjbCRtwgNQP"},"5":{"1":"WkdpRVbYsEDmsBq"}},{"1":{"1":"https://stylesatlife.com/wp-content/uploads/2015/11/Types-of-Dogs-22.jpg","3":482,"4":420},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSr-BIza-ID0B_5mHNYZVelACXRObpmJR0A5-vL7LpFQt16XH8t3g","3":200,"4":174},"3":{"1":"Styles At Life","2":"https://stylesatlife.com/articles/types-of-dogs/","3":"25 Different Types of Dogs with Origins and Pictures | Styles ...","4":"Types of Dogs 22","10":"SmymfRmNuLHFEc"},"5":{"1":"DnhvsmvWSkWTSkR"}},{"1":{"1":"https://images.pexels.com/photos/406014/pexels-photo-406014.jpeg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQMgpV4Dnq4Jd3rBDSJn7AgBp8tMMC9mvRmrd3mCQFe5fs_pW4u","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/dog/","3":"Dog images · Pexels · Free Stock Photos","4":"Free stock photo of animal, dog, pet, cute","10":"dxlyAYargfusMe"},"5":{"1":"GwgMRCRrwyIBqXi"}},{"1":{"1":"https://s3.amazonaws.com/cdn-origin-etr.akc.org/wp-content/uploads/2017/11/13001724/American-Eskimo-Dog-On-White-01-400x267.jpg","3":400,"4":267},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTsGNRvlsg6L4sauv_tewVzBQdd7kdb-vT-jKmX6_AB6RWes_V2VA","3":200,"4":133},"3":{"1":"American Kennel Club","2":"https://www.akc.org/dog-breeds/smallest-dog-breeds/","3":"Smallest Dog Breeds – American Kennel Club","4":"American Eskimo Dog","10":"VJLsPEQkfoTgaB"},"5":{"1":"ToAVtwjKBjwaVpB"}},{"1":{"1":"https://www.nc3rs.org.uk/sites/default/files/Images/Animals/Beagles%20in%20safety%20testing%20of%20pharmaceuticals%20-%20RDS.Wellcome.jpg","3":1200,"4":993},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQebnD-bP3tQJxRd0Lw5FaVB6Tmn2b65Or7Snpg04onQpecxfU7ng","3":200,"4":165},"3":{"1":"NC3Rs","2":"https://www.nc3rs.org.uk/3rs-resources/housing-and-husbandry/housing-and-husbandry-dogs","3":"Housing and Husbandry of Dogs | NC3Rs","4":"This page provides advice on the housing of laboratory dogs, tools for their welfare assessment, ...","10":"pOQBKsUaAExDxp"},"5":{"1":"soKGyPTBNHVPxGm"}},{"1":{"1":"https://cdn.theatlantic.com/assets/media/img/mt/2016/07/max_2/lead_720_405.jpg?mod=1533691832","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRrD_FLFfRw23FSZMRB5oLYOi28vU0rrIsEPf6O_oqlKVtYth2RRA","3":200,"4":112},"3":{"1":"The Atlantic","2":"https://www.theatlantic.com/entertainment/archive/2016/07/the-secret-life-of-pets/490580/","3":"For the Love of Dogs: 'The Secret Life of Pets,' Reviewed ...","4":"Illumination","10":"YYLAymmDrQbMHf"},"5":{"1":"HmwhYiETYOWcYNv"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/d/d9/Collage_of_Nine_Dogs.jpg","3":1665,"4":1463},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRGLQqDCxokM9-_Unrinvx32TEgykSGEiFd8ZN9_ZSsfrEI1ue4iQ","3":200,"4":175},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Dog","3":"Dog - Wikipedia","4":"Collage of Nine Dogs.jpg","10":"uUlLvuUdcuOcIL"},"5":{"1":"uRpIPGNqDVNVpKg"}},{"1":{"1":"http://nldogwhisperer.com/_Media/p4180071_med.jpeg","3":281,"4":281},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDL2Bb5WHO2ylKI0hZM6TqQdBdlk89CR4BMmWlOK02VWBc-dBbNw","3":200,"4":200},"3":{"1":"Newfoundland's Dog Whisperer","2":"http://nldogwhisperer.com/for-the-love-of-dogs/","3":"For the Love of Dogs | Newfoundland's Dog Whisperer","4":"P4180071","10":"DLKanCBMubnDNQ"},"5":{"1":"WBbNVOrlmjMkMgc"}},{"1":{"1":"https://www.wikihow.com/images/1/1d/Take-Care-of-Your-Dog's-Basic-Needs-Step-35.jpg","3":3200,"4":2400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTYXiN0MJz5noouc0Rd01auqVsg8HYdxj4XBWBUl9bMMY8lTVG8yA","3":200,"4":149},"3":{"1":"wikiHow","2":"https://www.wikihow.com/Take-Care-of-Your-Dog%27s-Basic-Needs","3":"How to Take Care of Your Dog's Basic Needs (with Pictures)","4":"","10":"bQvvWVUSirmQyO"},"5":{"1":"XuJuXQFfiNvxlyK"}},{"1":{"1":"https://res.cloudinary.com/dk-find-out/image/upload/q_80,w_640,f_auto/12173877_lnvjts.jpg","3":640,"4":459},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSOCIJw6yuhX0fDgoYYzEQXpa7a4ThCE0N_IaetPAZx_Nb0HoTf","3":200,"4":143},"3":{"1":"DK Find Out!","2":"https://www.dkfindout.com/us/animals-and-nature/dogs/domestic-dogs/","3":"Domestic Dogs | Different Types of Dogs | DK Find Out","4":"Dog-main gdcdzd 12173877 lnvjts ...","10":"LpcncxxURIVDEA"},"5":{"1":"RFwLNBmyxgHhnwp"}},{"1":{"1":"https://amp.thisisinsider.com/images/57991d1dd7c3dbae2f8b4657-750-753.png","3":750,"4":753},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQTpJq9dJS4dwAjqC6XT35fePL5fVdzpOcgr7djBXCQC45K3OFSCw","3":199,"4":200},"3":{"1":"Insider","2":"https://www.thisisinsider.com/dogs-before-and-after-haircuts-2016-7","3":"Dogs before and after haircuts - INSIDER","4":"Dogs Grace Chon","10":"OBPPjJXnGrWwvC"},"5":{"1":"UfREGxjhQAMqYTc"}},{"1":{"1":"https://timedotcom.files.wordpress.com/2017/04/world-of-dogs-07.jpg","3":2560,"4":1828},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQyXm57CVzJ5EUvu0HvCxqJ7QazwoqMvtL_CH8d-njiLP2lJXlk","3":200,"4":142},"3":{"1":"Time","2":"http://time.com/4775436/how-smart-is-a-dog-really/","3":"A Dog's Brain: Inside the Complex Canine Mind | Time","4":"Nina, an 8-month old Mini Australian Shepherd photographed in New York, NY","10":"SeOxdryAqGCQsI"},"5":{"1":"hPksBoksmOBlNAe"}},{"1":{"1":"https://www.sciencefriday.com/wp-content/uploads/2015/07/12872-1.JPG","3":1000,"4":586},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQuiulGxI6NDSiHAn-tomXc8p0pbyoFyE8F5LGL4Al6ov-QIC0uDQ","3":200,"4":117},"3":{"1":"Science Friday","2":"https://www.sciencefriday.com/segments/dogs-theyre-just-like-us/","3":"Dogs, They're Just Like Us - Science Friday","4":"","10":"hyVtWTqlYpfQXU"},"5":{"1":"goAktcmFFRUUUxT"}},{"1":{"1":"http://images.performgroup.com/di/library/sporting_news/dc/50/dog-3jpg_cp4bgn0c2fk31va2bwpmsci2b.jpg?t=1041338754&w=960&quality=70","3":960,"4":540},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRyNLvBbdisDSOVgm54zOFo3euAJl01P_n7MHrsjGwKHnE-Svjr","3":200,"4":112},"3":{"1":"Sporting News","2":"http://www.sportingnews.com/us/other-sports/news/adorable-dogs-2017-westminster-dog-show-photos/q4qu9orrlgq11k3mhptiohrlp","3":"Adorable photos of dogs at the 2017 Westminster Dog Show ...","4":"Dog 3.jpg","10":"rJfjBxOadbyMjm"},"5":{"1":"JSQfIlTHfpFNgrw"}},{"1":{"1":"https://i2-prod.mirror.co.uk/incoming/article6113280.ece/ALTERNATES/s615/PAY--Dog-swallowed-21-inch-riding-crop--whole.jpg","3":615,"4":409},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRtkEnSyD6xOwHjh59HAejWd4_9LUq3131QxZkw9JCmB0SJs99Jww","3":200,"4":133},"3":{"1":"Daily Mirror","2":"https://www.mirror.co.uk/news/uk-news/sickening-pictures-poorly-boxer-show-7062981","3":"Sickening pictures of poorly boxer show the danger of dogs ...","4":"Hugo the dog who swallowed a 21 inch riding crop","10":"jKlAiLEGdNSLvC"},"5":{"1":"VrBMenmDSMcGMus"}},{"1":{"1":"http://3.bp.blogspot.com/-F2N-smOO2eI/UfCrLF7syeI/AAAAAAAAAE4/Mp4o0J2vw8s/s1600/Type+of+dog+Patuljasti+SPICE.jpg","3":500,"4":477},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQYrAmtPktHqaOxLhSZekIE7JAYa75a9Y2IcCaC1RYJZJbZFUg","3":200,"4":190},"3":{"1":"types of dogs","2":"http://all-typesofdogs.blogspot.com/2013/01/type-of-dog-patuljasti-spice.html","3":"Type of dog Patuljasti SPICE - TYPES OF DOGS","4":"Type of dog Patuljasti SPICE","10":"cSrkLMkXibhHAn"},"5":{"1":"hMYJhfkRorfymFf"}},{"1":{"1":"http://www.qygjxz.com/data/out/183/3980549-pictures-of-dogs.jpg","3":1920,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTbcM2cUV0OTBqLzu9PI67wGMZ1zscxyhetpuCT7iDcMtL4w4Q8","3":200,"4":124},"3":{"1":"QyGjxZ","2":"http://www.qygjxz.com/pictures-of-dogs.html","3":"Pictures Of Dogs - QyGjxZ","4":"Pictures Of Dogs","10":"LOfwRGKPjLYykB"},"5":{"1":"CjNNRjsPTHWFxeo"}},{"1":{"1":"http://www.pawculture.com/uploads/magic-of-dogs-book-destroyer-card.jpg","3":300,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRzAFi5bs4u5U0ltE5wgvLY7T-WDzDMctigQm98cc6Yt5eltVwI","3":200,"4":200},"3":{"1":"PawCulture","2":"http://www.pawculture.com/get-inspired/magic-of-dogs","3":"Magic of Dogs | PawCulture","4":"Daisy the puppy in a closet","10":"OSmQrTICUnJcUR"},"5":{"1":"mITEEsGnnMdmedm"}},{"1":{"1":"https://www.soidog.org/sites/default/files/Dogs_for_adoption.jpg","3":1200,"4":662},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7CIoAyUpdA0z_qUGMgonqjeI0B9Vj-Ughlhil-aDrCZ8dVlrlYg","3":200,"4":110},"3":{"1":"Soi Dog Foundation","2":"https://www.soidog.org/adopt-a-dog","3":"Dogs For Adoption | Soi Dog Foundation","4":"At the Soi Dog Foundation shelter, hundreds of dogs wait in anticipation of loving homes.","10":"LTrFnEFufygVUl"},"5":{"1":"ekyHhXeckvbeULy"}},{"1":{"1":"https://www.abc.net.au/news/image/7089596-3x2-940x627.jpg","3":940,"4":627},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpb6cNSSuVCnstfWoSuYxVldq9VBTuPeJtu9Nvw3OiMTOVxNeuQg","3":200,"4":133},"3":{"1":"ABC","2":"http://www.abc.net.au/news/2016-01-22/dog-cruelty-stolen-pets-tourists-fuelling-growth-in-meat/7088380","3":"Dog cruelty: Rise in slaughter of stolen pets as Western ...","4":"... Thousands of dogs have been taken by dog meat smugglers but hundreds have been saved","10":"QKBMOWnXdPgsOs"},"5":{"1":"poXeMAIMtVwnynW"}},{"1":{"1":"https://ybxzcgnc7b-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/male-dog-names-696x435-2.jpg","3":696,"4":435},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSBtHfW9n6ZlEpWaon8kohv1YMJLwXGWfW9U9AB4uztQ2TyLs2ExA","3":200,"4":124},"3":{"1":"The Labrador Site","2":"https://www.thelabradorsite.com/male-dog-names/","3":"Male Dog Names - 150 Brilliant Boy Puppy Name Ideas","4":"Looking for the best male dog ...","10":"yftxFbRJDNJFiA"},"5":{"1":"CwgdpgemBLeBpKD"}},{"1":{"1":"https://www.sciencemag.org/sites/default/files/styles/inline__450w__no_aspect/public/dogs_16x9_0.jpg?itok=6bVMiQge","3":450,"4":253},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSoAY0lBnJg5p3jCKy0bYcuiA-CAS6fwaYe-dwgy0fKfchB82xYow","3":200,"4":112},"3":{"1":"Science","2":"https://www.sciencemag.org/news/2018/08/gene-editing-dogs-offers-hope-treating-human-muscular-dystrophy","3":"Gene editing of dogs offers hope for treating human muscular ...","4":"A colony of dogs at the Royal Veterinary College in London has a mutation that causes a disease ...","10":"uXDTlpYMRxSysc"},"5":{"1":"hfpslxcHPIhamYL"}},{"1":{"1":"http://www.pbs.org/wgbh/nova/assets/img/posters/meaning-dog-barks-in.jpg","3":322,"4":215},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR83E68kzlY537bxNXFpIzyh4q5OHHa1PZMrJ3n1HOaKfuVDDO7","3":200,"4":133},"3":{"1":"PBS","2":"http://www.pbs.org/wgbh/nova/nature/meaning-dog-barks.html","3":"NOVA - Official Website | The Meaning of Dog Barks","4":"Sources","10":"HeNjnISBGrERNc"},"5":{"1":"yxTUeintWQNxRXd"}},{"1":{"1":"http://cdn.designbeep.com/wp-content/uploads/2011/07/4.dog-love-photos.jpg","3":500,"4":525},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcScX6-QU4RNXhufTydEl5dppkHDnc0XMxOKFScQUw8xjadr6Ljc","3":190,"4":200},"3":{"1":"Designbeep","2":"http://designbeep.com/2011/07/29/heart-touching-photos-of-dogs-with-humans/","3":"Heart Touching Photos of Dogs with Humans | Designbeep","4":"humans and dogs","10":"VBfUhIuRdeHujs"},"5":{"1":"uMfRjnatednVxnF"}},{"1":{"1":"https://gfnc1kn6pi-flywheel.netdna-ssl.com/wp-content/uploads/2015/04/2015-0423-1157-fb.jpg","3":1120,"4":584},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSM1fHGWOoPPAiEUl6E9FQOgXzVpYzf9isnt8a78ScgfGWq8oGP","3":200,"4":104},"3":{"1":"The Happy Puppy Site","2":"https://thehappypuppysite.com/dog-breed-groups/","3":"Different Types Of Dogs: The Dog Breed Groups Explained","4":"a group of small dogs puppies beagle","10":"NlbBUKGIwLLigm"},"5":{"1":"vNMpIKLUHNsBVaG"}},{"1":{"1":"https://www.police.gov.hk/info/img/pdu/German_Shepherd.jpg","3":400,"4":322},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQFxTlVZoUanSWoUXLNE6pXXWLSzJQu9l1FMxKLCdlSsn7uTzv5","3":200,"4":160},"3":{"2":"https://www.police.gov.hk/ppp_en/11_useful_info/pdu/type.html","3":"Type of Dogs | Hong Kong Police Force","4":"Type of Dogs","10":"HmIFpgTtwytwTY"},"5":{"1":"jNsiYMpoJodyirS"}},{"1":{"1":"https://images.penguinrandomhouse.com/cover/9780451497604","3":292,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvd839rC2S7o1c6nOIZt_sQ1hi0p7zWbI7cR_k6-C098hW9qPv","3":129,"4":200},"3":{"1":"Penguin Random House","2":"https://www.penguinrandomhouse.com/books/546898/the-grace-of-dogs-by-andrew-root/9780451497611/","3":"The Grace of Dogs by Andrew Root | PenguinRandomHouse.com","4":"The Grace of Dogs by Andrew Root","10":"TLRVaBgWkJywvH"},"5":{"1":"wKJVsNHAkjobIKG"},"7":{"1":{"10":{"3":"The Grace of Dogs by Andrew Root | PenguinRandomHouse.com","5":"In the bestselling tradition of Inside of a Dog and Marley & Me, a smart, illuminating, and entertaining read on why the dog-human relationship is ...","6":true,"7":15.949999809265137,"8":"USD"}}}},{"1":{"1":"http://1.bp.blogspot.com/-D1v9yJRY3Xg/T7ZWzWXAleI/AAAAAAAABuU/4r7Cx4Fra0c/s1600/all+types+of+dogs+1.jpg","3":432,"4":625},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSAbyyckK5hIAi5GlQ0t8QhR_EItcdEtUPBhiljyqGLDey1uBta","3":138,"4":200},"3":{"1":"My Top Collection","2":"http://mytopcollection.blogspot.com/2012/05/all-types-of-dogs.html","3":"My Top Collection: All types of dogs","4":"All types of dogs","10":"UilxngmFAWEiiK"},"5":{"1":"gboiCenfWAMpIND"}},{"1":{"1":"https://cdn.theatlantic.com/assets/media/img/mt/2018/03/wes_andersons_isle_of_dogs_is_a_tenderhearted_eccentric_canine_tale_ew_review/lead_720_405.jpg?mod=1533691928","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQAhkKwPcbRFSxfvQujIzPRVsP1vF0CURiSHZVSFvhQs31Dtth9","3":200,"4":112},"3":{"1":"The Atlantic","2":"https://www.theatlantic.com/entertainment/archive/2018/03/isle-of-dogs-review/556292/","3":"Wes Anderson's 'Isle of Dogs' Is Beautiful and Sad: Review ...","4":"Fox Searchlight Pictures. “","10":"oSNOuYnslFqJPQ"},"5":{"1":"WDVuvFIUhbsBclN"}},{"1":{"1":"https://cdn.flickeringmyth.com/wp-content/uploads/2018/03/Isle-of-Dogs-character-posters-5-600x851.jpg","3":600,"4":851},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQw50y6LpR2SFWeRSzXZhCEnBGSZ-8kL88QDFSI5CwcDosNKZCzfQ","3":140,"4":200},"3":{"1":"Flickering Myth","2":"https://www.flickeringmyth.com/2018/03/isle-of-dogs-gets-a-series-of-canine-character-posters/","3":"Isle of Dogs gets a series of canine character posters","4":"ISLE OF DOGS tells the story of ATARI KOBAYASHI, 12-year-old ward to corrupt Mayor Kobayashi.","10":"hlcUpQnykUBRsD"},"5":{"1":"bJuriALucgcSYfp"}},{"1":{"1":"https://i.ytimg.com/vi/QrBvVOoQXCA/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRw6PNel35EaV_kL94y7L3NITd6CI0PQXT5GvgPyzsk23ThnYvl","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=QrBvVOoQXCA","3":"ISLE OF DOGS | Making of: Puppets | FOX Searchlight","4":"ISLE OF DOGS ...","10":"LaWwplLDmbxIGi"},"5":{"1":"YEASMqwXoGYlCoO"},"7":{"1":{"11":{"1":"ISLE OF DOGS | Making of: Puppets | FOX Searchlight","2":"Now on Digital: http://bit.ly/Isle-Of-Dogs Now on Blu-ray and DVD: http://bit.ly/Isle_Of_Dogs ISLE OF DOGS tells the story of ATARI KOBAYASHI, 12-year-old wa...","3":"4:01","4":"225512","5":"1522627200000","6":"FoxSearchlight","7":"4097","8":"181"}}}},{"1":{"1":"https://static.pjmedia.com/homeland-security/user-content/53/files/2017/03/AP_17071375979364.sized-770x415x0x587x2759x1487.jpg","3":770,"4":415},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPmnBCkO9u4V6pPdOCN-tdG7t2shwky_RJitakfAZCFZpWQV-y1A","3":200,"4":107},"3":{"1":"PJ Media","2":"https://pjmedia.com/homeland-security/2017/03/14/why-do-so-many-muslims-hate-dogs/","3":"Why Does Islam Teach Hatred of Dogs?","4":"Why Do So Many Muslims Hate Dogs?","10":"knGDhxKVKYAMoa"},"5":{"1":"UXGdXsRnndWjRkG"}},{"1":{"1":"https://ksassets.timeincuk.net/wp/uploads/sites/55/2018/03/M9WC84-copy-920x584.jpg","3":920,"4":584},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT2qLLzgdW9KLjmU1WyjWV8GdiwT2E0ORCDSG05edJ-CMPngeOZ","3":200,"4":126},"3":{"1":"NME.com","2":"https://www.nme.com/reviews/movie/isle-of-dogs-wes-anderson-film-review","3":"Isle Of Dogs review: \"a canine-tastic classic from Wes Anderson\"","4":"Isle of Dogs review","10":"tqSSbIayecUptP"},"5":{"1":"kDVrLYubfwlIEsJ"}},{"1":{"1":"https://cdn.abcotvs.com/dip/images/4233273_091318wtvddogrescuepg1.jpg","3":540,"4":960},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR32rG3iGhRx5mSI8or0zA-9glC4YGt6D4suZuwCcHCQov1P_hM","3":112,"4":200},"3":{"1":"WTVD","2":"https://abc11.com/peak-lab-rescue-saves-dozens-of-dogs-ahead-of-hurricane-florence/4233351/","3":"Peak Lab Rescue saves dozens of dogs ahead of Hurricane ...","4":"Peak Lab Rescue saves dozens of dogs ahead of Hurricane Florence","10":"idpRKpkMwsFNPM"},"5":{"1":"XqVxubpOOppKldH"}},{"1":{"1":"https://media.npr.org/assets/img/2018/03/20/isleofdogs_domestictrailera_txtd_stereo_pr.max-2000x2000_wide-65e44dee126c79b304eadea538e7a6e431a3b8f5-s800-c85.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQbw9ijmCB3MYzA9W0JI1zLSUByHhz7k8cmM-OX3ZJ8IOAyJqCC","3":200,"4":112},"3":{"1":"NPR","2":"https://www.npr.org/2018/03/22/595194000/the-fast-and-the-furry-us-wes-andersons-masterful-isle-of-dogs","3":"The Fast And The Furry Us: Wes Anderson's Masterful 'Isle Of ...","4":"The Fast And The Furry Us: Wes Anderson's Masterful 'Isle Of Dogs'","10":"TDSoYIgGdaUrsu"},"5":{"1":"fFrdWxxCaWYCrsq"}},{"1":{"1":"https://cdn.kinsights.com/cache/a2/d0/a2d0e228b189836ebc8db503b361d51b.jpg","3":700,"4":305},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKZFyzTBFFkSPnKYJRPYqO__yyePdhoQVpuJ4NMFeNYCeId4gaNg","3":200,"4":87},"3":{"1":"Care.com","2":"https://www.care.com/c/stories/6036/10-fastest-dog-breeds/","3":"10 Fastest Dog Breeds - Care.com","4":"Over the last few centuries, certain types of dogs have been bred for hunting and racing purposes.","10":"IPkBfAlgpdjjBJ"},"5":{"1":"GdiHoxKRefTnidc"}},{"1":{"1":"https://s.hswstatic.com/gif/frog-1.jpg","3":400,"4":349},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSkD4aIcnoKQk8ptMFEszKlT6UyhIkRee-431_9CtgdDMIvowV4","3":200,"4":175},"3":{"1":"Animals | HowStuffWorks","2":"https://animals.howstuffworks.com/amphibians/frog.htm","3":"How Frogs Work | HowStuffWorks","4":"Green tree frog (Hylidae cinerea). See more amphibian pictures.","10":"oIPgOQIeUteTVv"},"5":{"1":"qGflvvGOFClFscO"}},{"1":{"1":"https://media.wired.com/photos/5abc3122ecb0130b0e72616c/master/pass/frogleaf.jpg","3":2400,"4":1800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS269AZWer7OVu1kw705ldxEHbn2J-pHJ6JSnb0xN5xfG_CvoEl","3":200,"4":149},"3":{"1":"Wired","2":"https://www.wired.com/story/some-frogs-may-be-developing-a-resistance-to-the-disastrous-chytrid-fungus/","3":"Some Frogs May Be Developing a Chytrid Fungus Resistance | WIRED","4":"Some Frogs May Be Developing a Resistance to the Disastrous Chytrid Fungus","10":"WADbSMNiLmVldA"},"5":{"1":"GCKOCqfbKuVTFNd"}},{"1":{"1":"https://cosmos-magazine.imgix.net/file/spina/photo/10994/170407_Frogs_Full.jpg?fit=clip&w=835","3":835,"4":557},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRaVKwWQteHk6Jw5tfXQqYA56T98oG_gFg8K94grY4KlGoUBOAi","3":200,"4":133},"3":{"1":"Cosmos Magazine","2":"https://cosmosmagazine.com/palaeontology/the-death-of-the-dinosaurs-was-good-news-for-frogs","3":"The death of the dinosaurs was good news for frogs | Cosmos","4":"Two Petropedates cameronensis frogs, from Cameroon.","10":"oGVNAKqmOAwwLE"},"5":{"1":"EoJBsLKWhdkSUpN"}},{"1":{"1":"https://images.theconversation.com/files/117973/original/image-20160408-23649-1qxbogn.jpg?ixlib=rb-1.1.0&rect=0%2C516%2C2537%2C1652&q=45&auto=format&w=926&fit=clip","3":926,"4":603},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcROccUf9pp8ecFARqw_6DGs0uNfy88wxZrrmO3OLJmt4HAO-5l-","3":200,"4":130},"3":{"1":"The Conversation","2":"http://theconversation.com/the-future-for-frogs-looks-bleak-unless-humans-change-their-habits-57505","3":"The future for frogs looks bleak, unless humans change their ...","4":"The future for frogs looks bleak, unless humans change their habits","10":"GVxYqfUfpvOaNP"},"5":{"1":"hdrXHFELxglqDQA"}},{"1":{"1":"https://r.hswstatic.com/w_907/gif/frogs-sysk.jpg","3":907,"4":510},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4fKzSHuYmdwaVO9r3iz7z6-YU-RoiWrrU_aekfcxdSMs-_dkD","3":200,"4":112},"3":{"1":"Stuff You Should Know","2":"https://www.stuffyoushouldknow.com/podcasts/frogs.htm","3":"How Frogs Work | Stuff You Should Know","4":"How Frogs Work","10":"KcuycTLNCTKyeK"},"5":{"1":"kDRqcVBphsrCkxY"}},{"1":{"1":"https://le-www-live-s.legocdn.com/sc/media/lessons/wedo-2/wedo-projects/images/frogs-metamorphosis-project-image-feb9db40c70bcda57e12f5671d4bc278.jpg?fit=around|700:700&crop=700:700;*,*","3":700,"4":700},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRNbtN7UdIGFNqIJqRNaWtpxRa-8fONHoROYjex1_qG_s1yn_rlkw","3":200,"4":200},"3":{"1":"LEGO Education","2":"https://education.lego.com/en-us/lessons/wedo-2-science/frogs-metamorphosis","3":"Frog's Metamorphosis - WeDo 2.0 Science - Lesson Plans - LEGO ...","4":"Frog's Metamorphosis - WeDo 2.0 Science - Lesson Plans - LEGO Education","10":"LuCYFWOHovAfWs"},"5":{"1":"QYqyhfrbLHIDSaU"}},{"1":{"1":"https://www.amnh.org/var/ezflow_site/storage/images/media/amnh/images/frog/311113-1-eng-US/frog_dynamic_lead_slide.jpg","3":700,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTtD1jRBEihnL1c2uHLMsDTPHLbxaXgm2VniPs7rmxYCGSChO7n","3":200,"4":100},"3":{"1":"American Museum of Natural History","2":"https://www.amnh.org/exhibitions/frogs-a-chorus-of-colors","3":"Frogs: A Chorus of Colors","4":"frog","10":"BHmJIRtnQIHBsx"},"5":{"1":"llGYGsDHxxtOAgh"}},{"1":{"1":"https://cdn.theatlantic.com/assets/media/img/mt/2018/05/ohanlon3HR/lead_720_405.jpg?mod=1533691465","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSocW1F9hcYfvbUB2jHJEzREuIzDsbL6E-_20kEv-YMUbA8_A6l9Q","3":200,"4":112},"3":{"1":"The Atlantic","2":"https://www.theatlantic.com/science/archive/2018/05/frog-fungus-death/560078/","3":"The Origins of the Fungus Killing Frogs - The Atlantic","4":"A green and black frog with a red belly","10":"MEYPTxrgIFQDIY"},"5":{"1":"rlXkQPSDqhqLUYJ"}},{"1":{"1":"https://pmdvod.nationalgeographic.com/NG_Video/952/231/smpost_1507049364751.jpg","3":640,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSNoa4awiR95D5rAClkS7gFSV4JJXD08hAIb8LxjU_1M2i8eqqIcQ","3":200,"4":112},"3":{"1":"National Geographic","2":"https://video.nationalgeographic.com/video/untamed/red-eyed-tree-frogs","3":"Why Does the Red-Eyed Tree Frog Have Three Eyelids?","4":"","10":"EodtsMOmwkmvxy"},"5":{"1":"TRhMSfpPGpbAhfi"}},{"1":{"1":"http://ichef.bbci.co.uk/wwfeatures/wm/live/1280_640/images/live/p0/29/n2/p029n2vj.jpg","3":1280,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTLGsWeKSeL3n9sUPGD7Mi-WZF50vWpD_UiYo1vxF9P_V3LchLefQ","3":200,"4":100},"3":{"1":"BBC.com","2":"http://www.bbc.com/earth/story/20141029-rare-frog-breeds-inside-bamboo","3":"BBC - Earth - Rare bush frog breeds inside bamboo","4":"","10":"tblmAYrHcdmEcx"},"5":{"1":"qnVLROrMlgjmrAr"}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/csz/news/800/2017/whyfrogsneed.jpg","3":700,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRAV6FLTscPNap-dxagGyyY5jA47enViUiFeyWiEpb6vS4xvxtl","3":200,"4":128},"3":{"1":"Phys.org","2":"https://phys.org/news/2017-05-frogs.html","3":"Why frogs need saving","4":"","10":"UBtkEBvnckXXVh"},"5":{"1":"wUKJyAlAUsxvETX"}},{"1":{"1":"https://3z2dsg30wpre3s82ui42uwfo-wpengine.netdna-ssl.com/wp-content/uploads/2013/02/dumpy-tree-frog.jpg","3":1000,"4":1000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTTuPr02JgQNW-5wZUoiCNTBlMkS6hGq_Gk5-uHx2CxvXZ6JdbkBg","3":200,"4":200},"3":{"1":"Underground Reptiles","2":"https://undergroundreptiles.com/product-category/animals/amphibians/tree-frogs/","3":"Tree Frogs Archives - Underground Reptiles","4":"","10":"NFYryMgPrFWjLY"},"5":{"1":"mxKEhURnKTFDgmp"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2016/11/frog-photography-tantoYensen-2-5836fb5fa3383__880.jpg","3":880,"4":646},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSD54DmGda4ORwNsiNxnRytlkNBFe4POeCfwnGP6A5dsndQ35EN","3":200,"4":146},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/frog-photography-tantoyensen/","3":"This Photographer Photographs Frogs Like You've Never Seen ...","4":"Cute Frog Photography","10":"GpxCpXhhYRfLQV"},"5":{"1":"kBgYakehSGARbAa"}},{"1":{"1":"https://www.sciencedaily.com/images/2017/09/170913193106_1_540x360.jpg","3":540,"4":359},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQYc8jroyQFXBEWjaWBa0XtZCJWB1eh4Q8mphleOwt_rVftk872","3":200,"4":133},"3":{"1":"ScienceDaily","2":"https://www.sciencedaily.com/releases/2017/09/170913193106.htm","3":"Evolution of 'true frogs' defies long-held expectations of ...","4":"Ranidae family are most diverse frog ...","10":"SgOrWSoNkQjkXN"},"5":{"1":"NEnjrAUuUAJVPYY"}},{"1":{"1":"http://ichef.bbci.co.uk/wwfeatures/wm/live/1280_640/images/live/p0/4v/6s/p04v6sqx.jpg","3":1280,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRfX2luQyVZ-zbrRFoz93CaY80yyDgBXgWTG6C-Ql7GlQbLg11M","3":200,"4":100},"3":{"1":"BBC.com","2":"http://www.bbc.com/earth/story/20170227-there-are-frogs-that-breed-high-up-in-trees","3":"BBC - Earth - There are frogs that breed high up in trees","4":"There are frogs that breed high up in trees","10":"tnfNeHaMnRjESm"},"5":{"1":"llxhwWaFRlrDOEE"}},{"1":{"1":"https://www.thelocal.fr/userdata/images/article/307e9b4f101734d3f1ed2c7ee4094e692ea7b179dbef0203206ee24ad0d7e233.jpg","3":768,"4":511},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTE8In6K644ktyYDfWI8HJsDnvZw0vFcE5nTcpa9qYL-hqFTCpQ","3":200,"4":133},"3":{"1":"The Local France","2":"https://www.thelocal.fr/20180416/why-are-dordognes-noisy-frogs-at-the-centre-of-a-bizarre-legal-battle","3":"Why are Dordogne's noisy frogs embroiled in a bizarre legal ...","4":"Why are Dordogne's noisy frogs embroiled in a bizarre legal battle?","10":"IpgQyHiQgmancc"},"5":{"1":"kJPYqQFixrMKmJp"}},{"1":{"1":"https://thumbs-prod.si-cdn.com/D8qEZnYE_JIK1U9_V6Q1igPGnhk=/800x600/filters:no_upscale()/https://public-media.smithsonianmag.com/filer/3b/6c/3b6c8ed1-90ae-4dad-a44d-8250be782a40/rayna_bell_-_litoria_revelata-040.jpg","3":800,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9MkD2sC0lqyeGsSZ_QfsvpkuFlXPF_ld0S1IecqgoECQMajtIcA","3":200,"4":149},"3":{"1":"Smithsonian Magazine","2":"https://www.smithsonianmag.com/smithsonian-institution/color-changing-marvel-tree-frogs-looking-love-180964976/","3":"The Color-Changing Marvel of Tree Frogs Looking for Love | At ...","4":"A new study sheds light on the wild world of “dynamically dichromatic” amphibians","10":"pEaiVEpDYmLlaL"},"5":{"1":"BDEGPeAgkqWTiSV"}},{"1":{"1":"http://www.savethefrogs.com/d/amphibians/images/ghana/Leptopeles-hyloides-Ankasa-bamboo-cathedral-1-a-328.jpg","3":328,"4":246},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQP4o62qPQpPjo_pwdks06whhF_Uz4pVbxCut95cUpidmvSgxvDDg","3":200,"4":149},"3":{"1":"Save the Frogs","2":"http://www.savethefrogs.com/d/countries/ghana/frogs.html","3":"Frogs & Toads of Ghana","4":"Ghana Frogs","10":"lIquJinHveRXLW"},"5":{"1":"vylFbObXVrHbFhs"}},{"1":{"1":"https://cdn.britannica.com/s:700x450/73/100273-004-341B9A8E.jpg","3":550,"4":372},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9bFMIckxreAHguJKrulYJi39C4ZkLez2JhxY-E7JvGstqHe5uLQ","3":200,"4":135},"3":{"1":"Encyclopedia Britannica","2":"https://www.britannica.com/animal/frog","3":"Frog | amphibian | Britannica.com","4":"Blue arrow-poison frogs (Dendrobates azureus).","10":"PNVCAfaSvvWxRY"},"5":{"1":"aUlpffuPEYYpKFT"}},{"1":{"1":"https://media.wired.com/photos/59273130af95806129f51e1b/master/pass/353A-Ranitomeya-reticulata_Luke-Verburgt.jpg","3":1920,"4":1388},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQPrE-yAWvR2XWEizAmM2pY3K0Av9f17-c5QA-OwgjUSezsmMfGmw","3":200,"4":144},"3":{"1":"Wired","2":"https://www.wired.com/2016/02/frogs-are-really-cool-too-bad-humans-are-killing-them-all/","3":"Frogs Are Really Cool. Too Bad Humans Are Killing Them All ...","4":"Frogs Are Really Cool. Too Bad Humans Are Killing Them All | WIRED","10":"tSjajvqkTHwDPN"},"5":{"1":"NqjLVMLdPkGSOsB"}},{"1":{"1":"https://www.sciencenews.org/sites/default/files/2017/03/main/articles/033017_sm_glass-frog_main_free.jpg","3":860,"4":460},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRQHa3--9uCPkM0iiBenOnNDj2vO_kmQjEa3HbDBy26T7_BEwlG-Q","3":200,"4":106},"3":{"1":"Science News","2":"https://www.sciencenews.org/article/glass-frogs-moms-matter-after-all","3":"For glass frogs, moms matter after all | Science News","4":"Cochranella granulosa glass frog","10":"IcObVOyrqXnwvC"},"5":{"1":"ulDbeqrODGiydVM"}},{"1":{"1":"https://amp.businessinsider.com/images/5980f384b50ab181238b5252-750-563.jpg","3":750,"4":563},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT70yS_9h8ZASXTDmysouJ_pLldMTMXxX3roO92SCgsO0QSnlFg2g","3":200,"4":149},"3":{"1":"Business Insider","2":"https://www.businessinsider.com/xenopus-frogs-pregnancy-test-2017-8","3":"Pregnancy tests used to be African clawed frogs - Business ...","4":"frogs national xenopus laevis resource marine biological laboratory dave mosher 0","10":"gCpaiJGcuchnym"},"5":{"1":"UTouCGNEmGWJBJi"}},{"1":{"1":"https://media.mnn.com/assets/images/2016/04/frog-head-tilted.jpg.620x0_q80_crop-smart_upscale-true.jpg","3":620,"4":414},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSNpAL5idNr74cEBBf75cRuQi7oFFcVXOAoDUB8jVGmqLdf3BdW","3":200,"4":133},"3":{"1":"Mother Nature Network","2":"https://www.mnn.com/earth-matters/animals/quiz/how-much-do-you-know-about-frogs","3":"How much do you know about frogs? | MNN - Mother Nature Network","4":"frog with head tilted","10":"mjkGEObGkpygTr"},"5":{"1":"WGNgwQbnnUmmsUU"}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2014/157-researchersd.jpg","3":2778,"4":1974},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS383ka-_gDmTcl5dHI4lnxq4HU69cU8zUA-NjtbYN5GUkfB6xuow","3":200,"4":142},"3":{"1":"Phys.org","2":"https://phys.org/news/2014-10-rare-bush-frog-bamboo.html","3":"Researchers discover for the first time that a rare bush frog ...","4":"Researchers discover for the first time that a rare bush frog breeds in bamboo","10":"wMHSHquWwPWuIG"},"5":{"1":"BqpyHxyDjNlDOSR"}},{"1":{"1":"https://www.floridamuseum.ufl.edu/science/wp-content/uploads/2016/11/gree-treefrog-krysko-1frog.jpg","3":975,"4":649},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRV4hWTYfPeCxXNxv2vP0MLRuOrwGPF1dK-PXiR3GjapGlE_3w","3":200,"4":133},"3":{"1":"Florida Museum of Natural History","2":"https://www.floridamuseum.ufl.edu/science/florida-frog-calls/","3":"Florida Frog Calls – #FloridaMuseumScience","4":"","10":"RgOOcSgRawmGTr"},"5":{"1":"VAoaOdRoPyYymPe"}},{"1":{"1":"https://s.hswstatic.com/gif/hallucinogenic-frog-1.jpg","3":400,"4":267},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT811qRcXqq1PKIwHn9ctU6NOfMcp7OfHJrhniRNyrq9e6Q9LsJsg","3":200,"4":133},"3":{"1":"Animals | HowStuffWorks","2":"https://animals.howstuffworks.com/amphibians/hallucinogenic-frog.htm","3":"Are there really hallucinogenic frogs? | HowStuffWorks","4":"Ribbett. Australia wants to give cane toads the boot. See more amphibian pictures.","10":"NNRXlXtRjYMXKr"},"5":{"1":"irnuUmaNbBDwXsa"}},{"1":{"1":"http://wildlife.org/wp-content/uploads/2015/08/SM-Salty-frogs-1-Greg-Schechter.jpg","3":3072,"4":1307},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDperTWUFzqrHIxQvZoMnbg-SzfPleA99g2_Gd60dv4YyNkc0L","3":200,"4":84},"3":{"1":"The Wildlife Society","2":"http://wildlife.org/how-frogs-cope-with-road-salt-and-brackish-water/","3":"How Frogs Cope With Road Salt and Brackish Water | THE ...","4":"An ...","10":"RRpuUmLEdTvNps"},"5":{"1":"ErJdfKSPnleMFRc"}},{"1":{"1":"https://cdn.the-scientist.com/assets/articleNo/32185/iImg/5427/1c333be1-1cd8-45a4-8840-aad851ea8123-640treefrog.jpg","3":638,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuJIm3zsoZMJwIQI-kFWptxRxddJGx5bGJkqs-0S2xYUL0F4DtCg","3":200,"4":113},"3":{"1":"The Scientist Magazine","2":"https://www.the-scientist.com/daily-news/how-traffic-noise-affects-tree-frogs-32185","3":"How Traffic Noise Affects Tree Frogs | The Scientist Magazine®","4":"Hyla arboreaCOURTESY OF THIERRY ...","10":"jaITNMFTLHjCDB"},"5":{"1":"rDVROHvmnyPnAQf"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Anoures.jpg/220px-Anoures.jpg","3":220,"4":319},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSB5OFn6zL-xT4LUPF21-aA9iwNV-a6ZpxbW0DL6Tr5U5pnIfFJ","3":137,"4":200},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Frog","3":"Frog - Wikipedia","4":"Various types of frogs.","10":"TDygJSxFsEHNNb"},"5":{"1":"XeraFUqFJNRCGIG"}},{"1":{"1":"http://www.savethefrogs.com/d/amphibians/images/Litoria-Fallax-Eastern-Sedge-Frog-ds-a.jpg","3":328,"4":254},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQWVy0kfPnm_-zROsm1XFnA7EKepvf0lSJ9iTh1LJyU8P_vkTj6","3":200,"4":154},"3":{"1":"Save the Frogs","2":"http://www.savethefrogs.com/d/threats/index.html","3":"Threats to Frogs","4":"Litoria fallax - Eastern Sedge Frog","10":"vGsIryEramLpBD"},"5":{"1":"odudiYsEAYmertr"}},{"1":{"1":"https://www.pca.state.mn.us/sites/default/files/greenfrog-rclamilg.jpg","3":250,"4":192},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS_jrIVEN0NHjruuGWXQYtwz-mIZryI5Ohu5liTYZeGwick0yoetA","3":200,"4":153},"3":{"1":"Minnesota Pollution Control Agency","2":"https://www.pca.state.mn.us/living-green/frogs-minnesota","3":"Frogs of Minnesota | Minnesota Pollution Control Agency","4":"Green frog (Rana clamitans) Listen to the call","10":"DtexviIWEYAioL"},"5":{"1":"iymrjxsAarRNyqK"}},{"1":{"1":"https://static01.nyt.com/images/2018/04/03/science/30Zimmer-1/30Zimmer-1-articleLarge.jpg?quality=75&auto=webp&disable=upscale","3":600,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRg48ytBu6zAYEm6Vak59KHCkczIts4UjZpDIXON8Xz04WiIy8P","3":200,"4":149},"3":{"1":"The New York Times","2":"https://www.nytimes.com/2018/03/29/science/frog-species-panama-fungus-rebound.html","3":"A Few Species of Frogs That Vanished May Be on the Rebound ...","4":"Image","10":"WFnybfuMiBvtbq"},"5":{"1":"iVFcPipApAbDUnM"}},{"1":{"1":"https://www.sciencedaily.com/images/2015/01/150120084545_1_540x360.jpg","3":359,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS1u35g96pNmfdVInRYeSr1hxsC0JW_xWRn8nL1BFP69W_nA8fP4Q","3":199,"4":200},"3":{"1":"ScienceDaily","2":"https://www.sciencedaily.com/releases/2015/01/150120084545.htm","3":"The seeing power of frogs: Frogs can detect single photons of ...","4":"Red-eye frog ...","10":"DwLdSrCqGJPnQn"},"5":{"1":"avpQCfRTQPjQuRb"}},{"1":{"1":"https://www.popsci.com/sites/popsci.com/files/styles/1000_1x_/public/images/2017/09/rayna_bell_-_dscn3184_0.jpg?itok=uD3aH5n_&fc=50,50","3":1000,"4":750},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRSg8gtykqCthu94tEl1-S2BXWKLDVVCEHHQ879Ct2iEOYFpIG0","3":200,"4":149},"3":{"1":"Popular Science","2":"https://www.popsci.com/frogs-change-color-orgies","3":"These frogs might change color to avoid confusion during ...","4":"A frog couple has sex. The male is yellow.","10":"bclaQHSsaIoFaW"},"5":{"1":"fkWsCbMSUeGMUvu"}},{"1":{"1":"https://wonderopolis.org/wp-content/uploads/2017/10/Frogs_and_Toadsdreamstime_xl_30843151.jpg","3":900,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTbNlkw_129iVOBFK3N8-duInY1cCBeLYxvsmIn4usa1b99FGo","3":200,"4":133},"3":{"1":"Wonderopolis","2":"https://wonderopolis.org/wonder/are-frogs-and-toads-the-same","3":"Are Frogs and Toads the Same? | Wonderopolis","4":"Wonder Contributors","10":"eySSflmKbfKRMG"},"5":{"1":"uBpfcLuQxLKgIYx"}},{"1":{"1":"https://www.sciencenewsforstudents.org/sites/default/files/2016/06/main/articles/060116_leopardfrog_main_SNS.jpg","3":860,"4":460},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSxVLjF4xOVgAdqZcHIVYLF_0sPJaVH5N0AhcHI7or9jdNTDVYA","3":200,"4":106},"3":{"1":"Science News for Students","2":"https://www.sciencenewsforstudents.org/article/why-some-frogs-can-survive-killer-fungal-disease","3":"Why some frogs can survive killer fungal disease | Science ...","4":"Leopard frog","10":"tAPGLJWjpeNNgF"},"5":{"1":"gjqakrYgfmpSEWa"}},{"1":{"1":"http://www.torontozoo.com/adoptapond/guide_images/Green%20Frog.jpg","3":720,"4":480},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSeqz9-u1RXG1QaZUZiCafyguHmln-WNtZhUu4kIx1ub3wlU-3uCg","3":200,"4":133},"3":{"1":"Toronto Zoo | Adopt A Pond | SGuides","2":"http://www.torontozoo.com/adoptapond/frogs.asp?fr=11","3":"Toronto Zoo | Adopt A Pond | SGuides","4":"Green Frog","10":"wgFqDwNcxpBuhX"},"5":{"1":"AvVIBNnUgajVBsE"}},{"1":{"1":"https://defenders.org/sites/default/files/styles/homepage-feature-2015/public/frogs_visser-ruurd.png?itok=gAa6MAqt","3":960,"4":480},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTgMktAwGtDGr628lxn6umXvObH5FhK9gr74bSbP9WvTt7-_5ka","3":200,"4":100},"3":{"1":"Defenders of Wildlife","2":"https://defenders.org/frogs/basic-facts","3":"Frogs | Basic Facts About Frogs | Defenders of Wildlife","4":"Frogs","10":"lyJyYSIWtJWjMf"},"5":{"1":"wFayTaBYdFYafFh"}},{"1":{"1":"https://news.nationalgeographic.com/content/dam/news/2017/04/27/frog-gallery/01-frog-day-gallery.ngsversion.1493410969588.adapt.1900.1.jpg","3":1900,"4":1261},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTDEHb9huCNeicJ_22gT2yp5zapE5T0VTrh2N-Cvf1kRRpEzHyFfg","3":200,"4":132},"3":{"1":"Latest Stories - National Geographic","2":"https://news.nationalgeographic.com/2017/04/frog-photos-save-frog-day/","3":"13 Gorgeous Pictures Remind Us Why Frogs Need Our Help","4":"","10":"IjNOCPUPHhlhve"},"5":{"1":"bRNCLBJoeoEkhIm"}},{"1":{"1":"https://i.ytimg.com/vi/Fa_I68L_APY/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvaHJGb7GygNJu7t6mgtQ-IKRVRvpfHsGsObxrS2Cb_5YsBLzM","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=Fa_I68L_APY","3":"World's Most Famous Frog!","4":"","10":"bbcjDPvxYExfaL"},"5":{"1":"eTlMaEBGhKXNQsB"},"7":{"1":{"11":{"1":"World's Most Famous Frog!","2":"Please SUBSCRIBE - http://bit.ly/BWchannel Watch More - http://bit.ly/BTpoisonfrog On this episode of Breaking Trail, Coyote tracks down Costa Rica’s most ic...","3":"7:58","4":"2622194","5":"1484006400000","6":"Brave Wilderness","7":"56906","8":"5741"}}}},{"1":{"1":"https://www.rbg.ca/image/events/frogs/frogslide-mexicanleaf.jpg","3":980,"4":480},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTi4ERHFfdC_UtsiGGg5on4mesPQfYLrVgvuSi5LjGGXvfWVcWR","3":200,"4":97},"3":{"1":"Royal Botanical Gardens","2":"https://www.rbg.ca/frogs","3":"Frogs - Royal Botanical Gardens","4":"Mexican Leaf Frog","10":"ePEhpmgjFyRaVL"},"5":{"1":"EQwwCqjQQqUeyUu"}},{"1":{"1":"https://cosmos-images2.imgix.net/file/spina/photo/11978/170925-Frog-Full.jpg?ixlib=rails-2.1.4&auto=format&ch=Width%2CDPR&fit=max&w=835","3":835,"4":555},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSk7YieHJL3q75pri3jgdNO0li65jlUTlHLBqeo_OnMd8CWkdYxJg","3":200,"4":133},"3":{"1":"Cosmos Magazine","2":"https://cosmosmagazine.com/biology/why-poisonous-frogs-don-t-croak","3":"Why poisonous frogs don't croak | Cosmos","4":"The little devil poison frog is immune to its own toxins.","10":"UeiEkghhVkMXKs"},"5":{"1":"WUoHoDDlhgfBtrO"}},{"1":{"1":"http://www.frogsofborneo.org/images/Header%20Frontpage.jpg","3":2000,"4":1145},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSiMg-d9JBxdtDIF6MccrQmpv2DVFycXK7-vjF0S9Jcvqi_KTom","3":200,"4":114},"3":{"2":"http://www.frogsofborneo.org/","3":"Frogs of Borneo","4":"Bornean Families","10":"CRMKIDvekmMVLT"},"5":{"1":"rlfRjDeDKVSjJIx"}},{"1":{"1":"https://kids.nationalgeographic.com/content/dam/kids/photos/articles/Other%20Explore%20Photos/R-Z/Wacky%20Weekend/Frogs/ww-frogs-budgetts-tile.ngsversion.1461604295186.adapt.1900.1.jpg","3":1900,"4":1068},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQhVTWE1uxmNxemqwwuhCBflDlg12w5EV8tcdnWZdU3ml1lLe2ixw","3":200,"4":112},"3":{"1":"National Geographic Kids","2":"https://kids.nationalgeographic.com/explore/wacky-weekend/frogs/","3":"Wacky Weekend: Frogs","4":"","10":"PpMNVnlqTuNRvy"},"5":{"1":"ygHfQinPsVhlRDU"}},{"1":{"1":"https://www.swarovski.com/medias/?context=bWFzdGVyfHJvb3R8NDkzMzh8aW1hZ2UvanBlZ3xoZTIvaDllLzg4NDg0NzA4MDI0NjIuanBnfGYzMGE4MTI1NjkxZTYzYjc2OTEyZmFiMjIzODM5OWU5NjhlZWI5ZTA3ZWViOTI2MzBkNWMwZWU3OGRjMWQyNmU","3":607,"4":607},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTqBrs02ONOspqXB32cicZkYZB3Yp4IrYQxI3K_U8le5cuHrZYV","3":200,"4":200},"3":{"1":"Swarovski","2":"https://www.swarovski.com/en-AR/p-5136807/Frogs/","3":"Frogs by SWAROVSKI","4":"Frogs - Swarovski, 5136807","10":"PsQJRbaRKxpryy"},"5":{"1":"PAPVKUeteEYVjso"},"7":{"1":{"10":{"3":"Frogs by SWAROVSKI","4":"Swarovski","5":"Honoring the unique flora and fauna of the rainforest, this pair of Swarovski frogs sparkles in a combination of vibrant crystal colors. The frogs can ...","7":19900.0,"8":"ARS"}}}},{"1":{"1":"https://jr.brainpop.com/science/animals/frogs/screenshot_1.png","3":600,"4":460},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS0XWJGUpxOeC3j6b7az5dv7y0bWOgXV-29SwL2Hw-LIudZX5F0bA","3":200,"4":153},"3":{"1":"BrainPOP","2":"https://jr.brainpop.com/science/animals/frogs/","3":"Frogs - BrainPOP Jr.","4":"Whoops! Looks like we had a problem playing your video. Refresh the page to try again.","10":"IFDBtpyVQMwWrO"},"5":{"1":"biORwvUFemtsbpV"}},{"1":{"1":"https://static01.nyt.com/images/2017/02/02/science/sciencetake-frogs-video/sciencetake-frogs-video-superJumbo.jpg","3":2048,"4":1365},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRpdhQxRxS3laHzJhYtcNQxezg_oIYGxbjPLI5SwmI5k5oWiJdUNQ","3":200,"4":133},"3":{"1":"The New York Times","2":"http://www.nytimes.com/topic/subject/frogs","3":"Frogs - The New York Times","4":"The Power of Frog Spit","10":"nFlfdHamKlFCET"},"5":{"1":"IgOMSaMcvdDJvfD"}},{"1":{"1":"https://www.rspb.org.uk/globalassets/images/birds-and-wildlife/non-bird-species-illustrations/common-frog_1200x675.jpg?preset=landscape_mobile","3":768,"4":432},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQneCrWRM20xTxTsyRjgncmLD4_d5dRnsVDFUzF7C5cE8Ul2_Uu","3":200,"4":112},"3":{"1":"RSPB","2":"https://www.rspb.org.uk/birds-and-wildlife/wildlife-guides/other-garden-wildlife/amphibians-and-reptiles/common-frog/","3":"Common Frog | What Do Frogs Eat & other Frog Facts - The RSPB","4":"Common frog","10":"hWliTCrvAjyrCm"},"5":{"1":"pfaqPXfSPlHMJWY"}},{"1":{"1":"https://i.kinja-img.com/gawker-media/image/upload/tgfdtzodvqb4egv9au6w","3":1152,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTv97ml3Gr9qxutD333q_xu2TyeqQHbRs07ex_A6ypKtsTvEefD","3":200,"4":124},"3":{"1":"ClickVentures - ClickHole","2":"https://clickventures.clickhole.com/acquire-frogs-1825124396","3":"Acquire Frogs","4":"","10":"MFsYykfcUNjRcn"},"5":{"1":"sRHvGnXMaNcuJNS"}},{"1":{"1":"https://news.utexas.edu/sites/default/files/styles/news_article_main_image/public/photos/epipedobates-anthonyi_872_830.jpg?itok=oW0C6k-o","3":1660,"4":996},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcStpr6bG1jDp0RgcXcV4_ysG8p8S64TGZ5-2XDk9wz-Vlwzo0s0kg","3":200,"4":120},"3":{"1":"UT News - The University of Texas at Austin","2":"https://news.utexas.edu/2017/09/21/why-poison-frogs-don-t-poison-themselves","3":"Why Poison Frogs Don't Poison Themselves | UT News | The ...","4":"Phantasmal Poison Frog (Epipedobates anthonyi)","10":"xSqSEpkCdmrHPP"},"5":{"1":"ieaUIKHjtRyVtQS"}},{"1":{"1":"https://imagesvc.timeincapp.com/v3/mm/image?url=https%3A%2F%2Ftimedotcom.files.wordpress.com%2F2017%2F05%2Ffrog2.jpg&w=1600&q=70","3":1512,"4":1265},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRkJWTXmEQHgBuRrjqaVc6B3ylbTfQY1Pt6XV0OI-f4TOfeb-FE","3":200,"4":167},"3":{"1":"Time","2":"http://time.com/4798314/transparent-frog-new-species-amazon/","3":"Transparent Frog: Scientists Discover New Species in Amazon ...","4":"Have a look: The transparent Hyalinobatrachium yaku frog","10":"dgiUNFlNKNOccA"},"5":{"1":"XXwbLBnCIlGQyvr"}},{"1":{"1":"https://cdn.the-scientist.com/assets/articleNo/30156/iImg/1051/frogs.jpg","3":640,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_hM5VsgXC_2i3qjylFXbM7To9vXuHsrIdrF8ToPAVfj1ddXD4AQ","3":200,"4":112},"3":{"1":"The Scientist Magazine","2":"https://www.the-scientist.com/features/frog-skin-yields-potent-painkillers-but-none-clinic-ready-30156","3":"Frog Skin Yields Potent Painkillers, but None Clinic Ready ...","4":"Frog Skin Yields Potent Painkillers, but None Clinic Ready | The Scientist Magazine®","10":"ynCfIlcKdHkixo"},"5":{"1":"bhsADIhKmrvyuci"}},{"1":{"1":"https://www.sciencemag.org/sites/default/files/styles/inline__450w__no_aspect/public/frog_16x9.jpg?itok=KqXPFU6-","3":450,"4":253},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRaSIlATqbnPq12oVBUV-FewL_jEHPUauSUvsYvya4JuM1LPxyjFg","3":200,"4":112},"3":{"1":"Science","2":"http://www.sciencemag.org/news/2017/07/can-you-tell-whether-frog-excited-just-listening-its-voice","3":"Can you tell whether this frog is excited just by listening ...","4":"Can you tell whether this frog is excited just by listening to its voice?","10":"RoUBvJcSfsQsEp"},"5":{"1":"wCdnAIPTKcdsehy"}},{"1":{"1":"http://www.backyardbuddies.org.au/_assets/images/buddy-hero-images/Green-Tree-Frog-Emily-Sephton.jpg","3":1600,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQBpqkRi_p8cw0r1zriKqubKg7I4407IYbBPCRcNAyLCzqCDiVo","3":200,"4":74},"3":{"1":"Backyard Buddies","2":"http://www.backyardbuddies.org.au/fact-sheets/frogs-1","3":"Frogs","4":"","10":"tCDKWOcIIqIleH"},"5":{"1":"kDcRCsbVfhmkpTF"}},{"1":{"1":"https://assets.bwbx.io/images/users/iqjWHBFdfxIU/imbdOzKpGFA8/v0/800x-1.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSkuYRypL8YpOM3Vafl6mD1qeYIlPtdEuClardhV-0iqZR4_O3F","3":200,"4":112},"3":{"1":"Bloomberg","2":"https://www.bloomberg.com/news/articles/2018-09-12/biohacker-makes-diy-mutant-frogs-and-hopes-they-don-t-croak","3":"The Biohacker Who Experimented on Himself Is Making DIY ...","4":"Illustration: Alvin Fai","10":"RXSyqHDTadRjtW"},"5":{"1":"vkPBNnHYwsnVFvv"}},{"1":{"1":"http://www.pbs.org/wnet/nature/files/2014/05/08_46MB-1000x469.jpg","3":1000,"4":469},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTmCB9eU3X3ExdbLwzLwhHxKgbu1nng-4QoHh-JT-CzBKJggJTm","3":200,"4":93},"3":{"1":"PBS","2":"http://www.pbs.org/wnet/nature/group/amphibians-reptiles/frog/","3":"Frogs | Nature | PBS","4":"Frogs are a diverse and largely carnivorous group of short-bodied, tailless amphibians composing the ...","10":"vuYFGyiAAfkGBk"},"5":{"1":"FrKpgBDXBgIYHNt"}},{"1":{"1":"https://kids.sandiegozoo.org/sites/default/files/2017-07/animal-hero-fantasticfrogs_0.jpg","3":1020,"4":580},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTBi_RE4pZgVrzGi0oOsFQ1upFnjroThpWTvvYtbIOg4WcsI1aY","3":200,"4":113},"3":{"1":"San Diego Zoo Kids","2":"https://kids.sandiegozoo.org/stories/fantastic-frogs","3":"Fantastic frogs | San Diego Zoo Kids","4":"Mossy frog","10":"WwCjiVEiYOYMUy"},"5":{"1":"CuWfmiUxmLvOvYN"}},{"1":{"1":"https://image.pennlive.com/home/penn-media/width620/img/wildaboutpa/photo/bullfrogjpg-e6472ceba9e0d463.jpg","3":504,"4":339},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRb48Qyf5Pyu7vj-WvC1637fW4gfxTu9Mj2MR-nWvHjxHHu-ZO3","3":200,"4":134},"3":{"1":"PennLive.com","2":"https://www.pennlive.com/wildaboutpa/2017/07/frogs_and_toads_of_pennsylvani.html","3":"Frogs and toads of Pennsylvania: Are there really 17 species ...","4":"bullfrog.jpg","10":"MsAdcYkHVqdUns"},"5":{"1":"avrqpgGUaxwIuwK"}},{"1":{"1":"https://www.enasco.com/medias/xenopus-frogs-categoryvideo-4.jpg?context=bWFzdGVyfGltYWdlc3w0MzgxMHxpbWFnZS9qcGVnfGltYWdlcy9oMDUvaGJkLzg3OTYyNDM0MjczNTguanBnfGUxZDEwODZhM2Y3MmE2NmU2YjQwM2FjOGE0OTMyNjEzMTZjNGZkZGYzYzI4NDI4NzQ0MDIxM2MzNzJkNWE1NjA","3":795,"4":384},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT5zCC-PVFgf7Qv21BIeSlYBvRJqkCg8ZTg9AwbDz7b4rmEClZk","3":200,"4":96},"3":{"1":"Nasco","2":"https://www.enasco.com/c/Education-Supplies/Xenopus-Frogs","3":"Xenopus Frogs | Education Supplies | Nasco","4":"Xenopus Tropicalis","10":"IaQBBwidFDPrCW"},"5":{"1":"wLjTrSuCIAbSvok"}},{"1":{"1":"https://cdn.britannica.com/s:700x450/57/22457-049-8F80A555.jpg","3":320,"4":240},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRC2g7gY5I0hlcR6Z4QhvO3In2kVjfG7bRe9zPNTsgEpAHjHMv","3":200,"4":149},"3":{"1":"Encyclopedia Britannica","2":"https://www.britannica.com/animal/frog","3":"Frog | amphibian | Britannica.com","4":"tree frog","10":"NMHkeHYhlmacxd"},"5":{"1":"yrkGEFyXWiJttwW"}},{"1":{"1":"https://cdn-images-1.medium.com/max/595/0*F57sByVPzim7oA4w.jpg","3":595,"4":335},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvKl7iN6SsOCeJ8Fll0Z02OxnR_x035trZiPcOOx5wZ-i_dhPofg","3":200,"4":112},"3":{"1":"The Economist - Medium","2":"https://medium.economist.com/hunting-for-frogs-in-the-western-ghats-270768e5bc7d","3":"Hunting for frogs in the Western Ghats – The Economist","4":"","10":"EVTOruFlqfrwql"},"5":{"1":"dCTcNXqnebIqpOA"}},{"1":{"1":"https://media.mnn.com/assets/images/2016/12/jaymi-heimbuch-_JH_1705-01.jpg","3":1500,"4":1000},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTqEEUZzO9SD97G3OK33jGBdkLiCVlRV8EhUH8uJ3SXncnQF0v0Jw","3":200,"4":133},"3":{"1":"Mother Nature Network","2":"https://www.mnn.com/earth-matters/animals/blogs/This-why-red-eyed-tree-frogs-have-red-eyes","3":"This is why red-eyed tree frogs have red eyes | MNN - Mother ...","4":"red-eyed tree frog","10":"tXEDrMjTLTVffk"},"5":{"1":"WHNDEeEFejqccyh"}},{"1":{"1":"https://www.wettropics.gov.au/site/user-assets/mcms_cb_resized/miketrenerryyellowgianttreefroglitoriainfrafrenata-1.jpg","3":428,"4":281},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJ79-75lr0_bJHHMIlrua9-5VXZf65pz8z9hZcHW0QNDTHbN1c","3":200,"4":131},"3":{"1":"Wet Tropics Management Authority","2":"http://www.wettropics.gov.au/frogs","3":"Frogs | Wet Tropics Management Authority","4":"Frogs","10":"uRyKVOHxdXSsmk"},"5":{"1":"QbFEoXpYyrEGjJM"}},{"1":{"1":"https://www.davincisciencecenter.org/wp-content/uploads/2018/05/leaf-frogs-900x600.jpg","3":900,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRraAutITBAvNnDVw-ZMxGOdt13vfXj1aWWTi_dElmIkO0Vv4oUjg","3":200,"4":133},"3":{"1":"Da Vinci Science Center","2":"https://www.davincisciencecenter.org/frogs-and-friends/","3":"Frogs and Friends - Da Vinci Science Center - Da Vinci ...","4":"The Solomon Island leaf frog has a loud call and eats crickets. Its body shape","10":"poKVJCxYdnKqqv"},"5":{"1":"ihBTVRWKYwlwLQD"}},{"1":{"1":"https://blog.nationalgeographic.org/wp-content/uploads/2013/11/poison-dart-frog-pumilio-defenses-s2048x1372-p.jpg","3":2048,"4":1372},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRHohSag9Y5M5cLULNwpN9CIuK3v1cXX63_cVi1lMUvMM4G8wMv","3":200,"4":134},"3":{"1":"National Geographic Blog - National Geographic Society","2":"https://blog.nationalgeographic.org/2013/11/21/poison-frogs-make-their-babies-toxic-too/","3":"Poison Frogs Make Their Babies Toxic, Too – National ...","4":"Photo of a strawberry poison dart frog in Costa Rica.","10":"JbVtKgCKdSCDpF"},"5":{"1":"HVtlNFOTShVHwPH"}},{"1":{"1":"https://australianmuseum.net.au/Uploads/Images/35550/P2060249_smll_big.jpg","3":526,"4":396},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQqu0UClFqLeww4-3Kl3DtKP4QOb0I93zzpekB4vzd9VJXvAt3j","3":200,"4":150},"3":{"1":"Australian Museum","2":"https://australianmuseum.net.au/blogpost/why-do-frogs-call","3":"Why do frogs call? - Australian Museum","4":"Graceful Tree Frog","10":"SKbgJUFUnTXUSG"},"5":{"1":"UgSWbgQLclfCCww"}},{"1":{"1":"https://static.independent.co.uk/s3fs-public/thumbnails/image/2018/06/14/12/frog-pond.jpg?w968h681","3":968,"4":681},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRcsVTOChE6B-9A6nmhsXu9rSwvz4PEy8nkrcC_8qfIHZWCypwJgw","3":200,"4":140},"3":{"1":"The Independent","2":"https://www.independent.co.uk/environment/frog-pesticides-female-fertility-chemicals-linuron-endangered-species-extinction-a8399401.html","3":"Pesticides could wipe out frogs by turning them female, study ...","4":"Amphibians such as this common frog could have their fertility impacted by the widespread use of","10":"iyIAOSSBEjwOOh"},"5":{"1":"rxmnwHOufvxpBRu"}},{"1":{"1":"https://www.mashpilodge.com/wp-content/uploads/mashpi-frogs-hyloscirtus-mashpi.jpg","3":1600,"4":1067},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQQfZJvwaZ3EojQn1-eO7Mj-fLyaLONuP3lBJC3gJ_ale1CY09m3Q","3":200,"4":133},"3":{"1":"Mashpi Lodge","2":"https://www.mashpilodge.com/the-amphibians-of-mashpi-type-of-toads-and-frogs/","3":"The amphibians of Mashpi – types of toads and frogs - Mashpi ...","4":"This frog is associated with rivers and bodies water, where it can be observed during night walks.","10":"yBLkOyCxDEKoae"},"5":{"1":"VLxvFyvAyDyKxBh"}},{"1":{"1":"http://cdn.sci-news.com/images/enlarge3/image_4673e-Red-Eyed-Tree-Frog.jpg","3":1920,"4":1407},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRV45DKX-3v_5slq83_DhC8HnJezhTby-xu984ywDIMeriPI2wj","3":200,"4":146},"3":{"1":"Sci-News.com","2":"http://www.sci-news.com/biology/frogs-see-color-extreme-darkness-04673.html","3":"Frogs Have Unique Ability to See Color in Extreme Darkness ...","4":"According to Yovanovich et al, frogs can see color in extreme darkness, down to","10":"DGLLcwTUHTSEBJ"},"5":{"1":"YPDAQqibncYwdyG"}},{"1":{"1":"https://asset-manager.bbcchannels.com/i/2fdrc1c20e61000","3":1730,"4":510},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRcnwCzJIetuwttMZoCBzhPYpWA3Y5U8LUiYfZbdBBZBPgPK_t8Q","3":200,"4":58},"3":{"1":"BBC Earth","2":"https://www.bbcearth.com/blog/?article=how-a-pregnancy-test-caused-a-catastrophe-for-frogs","3":"How a pregnancy test caused a catastrophe for frogs | BBC Earth","4":"","10":"qdgocElyxSTqkY"},"5":{"1":"yNbKaltLjiGApAU"}},{"1":{"1":"https://i.ytimg.com/vi/nyBZqRgbds4/maxresdefault.jpg","3":1688,"4":950},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvgZ_rnKmy-LUO_bgqV09Xo7VtxrFklvrk_FR7zBsh2UaBdDX3","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=nyBZqRgbds4","3":"Deadly Poison Dart Frog?","4":"","10":"ywtsACBNNDlKbh"},"5":{"1":"hWLcNTvNTqEOHBg"},"7":{"1":{"11":{"1":"Deadly Poison Dart Frog?","2":"Please SUBSCRIBE NOW! http://bit.ly/BWchannel Watch More - http://bit.ly/BTvinegaroon On this episode of Breaking Trail, Coyote ventures deep into the rainfo...","3":"7:19","4":"5023010","5":"1465257600000","6":"Brave Wilderness","7":"53218","8":"6142"}}}},{"1":{"1":"https://www.popsci.com/sites/popsci.com/files/styles/1000_1x_/public/images/2017/09/beelzebufo_bw.jpg?itok=Bsceo4Tm&fc=50,50","3":1000,"4":749},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ53aSAARzQhZhCs3dXMzRax6IrlFQDBVtcUKkiwiOZGw2HwKj3PQ","3":200,"4":149},"3":{"1":"Popular Science","2":"https://www.popsci.com/beelzebufo-devil-frog-bite-force-dinosaur","3":"Giant ancient frogs might have snacked on baby dinosaurs ...","4":"beelzebufo illustration","10":"bAsGfhyeefhjIT"},"5":{"1":"hJEuyvjjMTpcYyh"}},{"1":{"1":"https://img.purch.com/w/660/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzA5NS81MjEvb3JpZ2luYWwvZnJvZy13aXRoLWJpdGUtMDEuanBn","3":660,"4":412},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRqapZ9iWr9W9Oe_YbibjwU6erpILlkUc6WnnRWMMKLCA0fYUH66A","3":200,"4":124},"3":{"1":"Live Science","2":"https://www.livescience.com/60474-frog-with-powerful-bite.html","3":"Extinct Big-Mouthed Frogs May Have Dined on Dinos","4":"","10":"XaVkXuxBOQtOYM"},"5":{"1":"tGrvIFxeXtnParj"}},{"1":{"1":"http://www.cellphonetaskforce.org/wp-content/uploads/2012/01/frog-left.jpg","3":400,"4":349},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2wSIPot_nLb4yZwcoRXUiaxf0IZIiUnyQL_w21k0GOS7FvX4h6A","3":200,"4":175},"3":{"1":"Cellular Phone Task Force","2":"https://www.cellphonetaskforce.org/frogs/","3":"FROGS • Cellular Phone Task Force","4":"ALL ARTICLES BY ALFONSO BALMORI · Frog","10":"LBmFoLPUBwrHWV"},"5":{"1":"UTIlnIJacMSxMmw"}},{"1":{"1":"https://www.irishtimes.com/polopoly_fs/1.2197035.1430491144!/image/image.jpg_gen/derivatives/box_620_330/image.jpg","3":620,"4":330},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSlpk8viG1gD-hI0-Ibjct-tGd0wZwqyl_AHnL8kLDa0O1gFh0F","3":200,"4":106},"3":{"1":"The Irish Times","2":"https://www.irishtimes.com/news/science/toxic-frogs-how-do-they-make-their-poison-1.2197039","3":"Toxic frogs: how do they make their poison?","4":"A Sira poison frog (Ranitomeya sirensis)","10":"uuLugouUGykRXY"},"5":{"1":"enbGNsfFaLrpfDV"}},{"1":{"1":"https://www.environment.nsw.gov.au/-/media/OEH/Corporate-Site/Topics/Animals-and-plants/Native-animals/eastern-dwarf-tree-frog-litoria-fallax-109029.jpg","3":690,"4":580},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS8eSPAd8tNxrrC1QIH_M16-iew--LDC-62tRpFqYwRCM1gFFpdoA","3":200,"4":168},"3":{"1":"Office of Environment and Heritage - NSW Government","2":"https://www.environment.nsw.gov.au/topics/water/wetlands/plants-and-animals-in-wetlands/frogs","3":"Frogs in wetlands | NSW Environment & Heritage","4":"","10":"xgkwsnPjHadhee"},"5":{"1":"YloQyjvnXVxIxkp"}},{"1":{"1":"https://media.treehugger.com/assets/images/2018/05/golden_poison_dart_frog_photo.jpg.1200x0_q70_crop-smart.jpg","3":1200,"4":805},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSVzxce_y_9aBwPULkVsS581ldwa8toZ9uCPttXL-0Jhma2NKRm","3":200,"4":134},"3":{"1":"TreeHugger","2":"https://www.treehugger.com/slideshows/natural-sciences/16-beautiful-deadly-frogs/","3":"16 beautiful but deadly frogs | TreeHugger","4":"golden poison dart frog photo","10":"uwGepFKTYKyqLa"},"5":{"1":"SbDWopSVpGkxKFO"}},{"1":{"1":"https://www.mashpilodge.com/wp-content/uploads/mashpi-frogs-hyalinobatrachium-aureoguttatum.jpg","3":1600,"4":1273},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTfXZMfK9HGzYMUdGrrqmycQmI19-C_Dfsf_oYEkLSqx60K3UAG","3":200,"4":158},"3":{"1":"Mashpi Lodge","2":"https://www.mashpilodge.com/the-amphibians-of-mashpi-type-of-toads-and-frogs/","3":"The amphibians of Mashpi – types of toads and frogs - Mashpi ...","4":"Tree frogs (Hylidae)","10":"RmpLINVYskvAOi"},"5":{"1":"cUedHTGKOviDEvO"}},{"1":{"1":"https://www.crees-manu.org/wp-content/uploads/2017/05/cochranella-nola-glass-frog-eilidh-munro-peruvian-amazon-crees-foundation-research-sustainability5.jpg","3":1200,"4":800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2Ox9uBF6dmqIdJl96WhYixhJ4euA2Kdm15kqKSyDMQ1QU1BhG2A","3":200,"4":133},"3":{"1":"Crees Manu","2":"https://www.crees-manu.org/why-are-glass-frogs-transparent-cochranella-nola/","3":"Glass frogs: their weapon and weakness","4":"A glass frog with round, sticky toe pads blends into a leaf | Image © Eilidh Munro","10":"DnmtNUAAWptehN"},"5":{"1":"vwoBwiimxGbHhQq"}},{"1":{"1":"http://www.savethefrogs.com/d/day/images/icon-STF-Day-Last-Saturday-328.jpg","3":328,"4":246},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRoZ47SU0mt_tmoty9q6RwrdNkUHet4AofB4IM97KD1p1ORBuNC","3":200,"4":149},"3":{"1":"Save the Frogs","2":"http://www.savethefrogs.com/d/day/index.html","3":"Save The Frogs Day - April 29, 2017","4":"","10":"VQgobmBEaiwSSY"},"5":{"1":"sCWgepsdcGGKheQ"}},{"1":{"1":"https://smhttp-ssl-52271.nexcesscdn.net/media/catalog/product/w/h/white_s_tree_frogs_7.jpg","3":1797,"4":1789},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3eXxwGn2yYty-WrFBnJF6Dfd4PBj9ykuWY5SgTthzATQ6PFZKgg","3":200,"4":199},"3":{"1":"Josh's Frogs","2":"http://www.joshsfrogs.com/white-s-tree-frog-captive-bred.html","3":"Blue Phase White's Tree Frog - Litoria caerulea (CBP)- $34.99 Only 5 left Quantity Available: 5","4":"Blue Phase White's Tree Frog - Litoria caerulea (CBP) | Josh's Frogs","10":"rtPYdQKSKLIcIU"},"5":{"1":"AQxFvMDWWwwKMPL"},"7":{"1":{"10":{"3":"Blue Phase White's Tree Frog - Litoria caerulea (CBP)- $34.99 Only 5 left Quantity Available: 5","5":"White's Tree Frog (Captive Bred) - Litoria caerulea","6":true,"7":34.9900016784668,"8":"USD"}}}},{"1":{"1":"https://www.futurity.org/wp/wp-content/uploads/2016/07/mating_frogs2_1600-770x440.jpg","3":770,"4":440},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTBtcy-7M_1t5dx5nDND5tHuc2f1Bzv7Xxx020ax10cOtifp1hK","3":200,"4":114},"3":{"1":"Futurity.org","2":"https://www.futurity.org/frogs-mating-land-1212492-2/","3":"Some frogs mate on land to avoid a 'breeding frenzy' - Futurity","4":"","10":"FsAorQNLSeMLwS"},"5":{"1":"YbmpWttSsocNiVp"}},{"1":{"1":"https://images.mentalfloss.com/sites/default/files/styles/mf_image_16x9/public/froghed.png?itok=Bi4CHog0&resize=1100x1100","3":1100,"4":739},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQmY0H3CbzQT8mOLU0YUllEo-UFmUxxcAFPYm6vjsT_4dQOyymJ","3":200,"4":134},"3":{"1":"Mental Floss","2":"http://mentalfloss.com/article/71568/hawaiis-big-island-overrun-loud-frogs-puerto-rico","3":"Hawaii's Big Island Is Overrun With Loud Frogs From Puerto ...","4":"Hawaii's Big Island Is Overrun With Loud Frogs From Puerto Rico","10":"xseKINCUlyrvvk"},"5":{"1":"EETLpMYcyuUJiNf"}},{"1":{"1":"https://defenders.org/sites/default/files/frog-kevin-clark-dpc.jpg","3":498,"4":272},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSdlp5WACg_U6DCIeigBfLXDLqop9Q9zgib8dM8phjv7P9jc4xywA","3":200,"4":109},"3":{"1":"Defenders of Wildlife","2":"https://defenders.org/frogs/basic-facts","3":"Frogs | Basic Facts About Frogs | Defenders of Wildlife","4":"","10":"sbpFxFBQDgGtnc"},"5":{"1":"skuSpTbIYMWIUMF"}},{"1":{"1":"https://pmdvod.nationalgeographic.com/NG_Video/66/327/170127-news-finding-frogs-original-edit-vin_640x360_866906691953.jpg","3":640,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS5q2Gz_zZ4yGCE03P3_UwddQwRNY49y2CuKKlDvMG4j08DQvAqQw","3":200,"4":112},"3":{"1":"National Geographic","2":"https://video.nationalgeographic.com/video/news/170127-news-finding-frogs-original-edit-vin","3":"Tracking Frogs In the Amazon Rain Forest","4":"","10":"FuwxHswpnLfGeI"},"5":{"1":"uKfhwUXcIhoogNT"}},{"1":{"1":"http://www.aquariumofpacific.org/images/made/images/slideshow/frogs_slideshow_banner_940x260_940_260_85shar-70-.5-5.jpg","3":940,"4":260},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTvWwjH2RxiLhhzaYnK9ou-2d84Hx90uK4SvYfOQ5eMCF8cCcEK8g","3":200,"4":55},"3":{"1":"Aquarium of the Pacific","2":"http://www.aquariumofpacific.org/exhibits/frogs","3":"Aquarium of the Pacific | Frogs: Dazzling & Disappearing ...","4":"FROGS: Dazzling and Disappearing","10":"pkqLeJeLmKVNPF"},"5":{"1":"HTqRRDiwKRWWKBN"}},{"1":{"1":"https://media.npr.org/assets/img/2017/01/31/frog-promo-1d3cdbeae91022c34fc659ad35ec677db5fb477f-s800-c85.jpg","3":800,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRrh_0JT1Hmrrmk3TG2UQOs4tvHlayNaoSV_F6kCzWorG_Az374","3":200,"4":149},"3":{"1":"NPR","2":"https://www.npr.org/sections/thetwo-way/2017/01/31/512622260/to-catch-prey-frogs-turn-to-sticky-spit","3":"To Catch Prey, Frogs Turn To Sticky Spit : The Two-Way : NPR","4":"Enlarge this image","10":"pdqSoGRTEjggYa"},"5":{"1":"VsMstoapUTjNyhP"}},{"1":{"1":"https://www.thesprucepets.com/thmb/mBbnO3P3iy42LYw40qiqHrw7y6M=/450x0/filters:no_upscale():max_bytes(150000):strip_icc()/GettyImages-175174320-581251b65f9b58564ccaffe2.jpg","3":450,"4":338},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSgO-9VaUig5kL576jezP40Xe6p85j65n3RCkuY6y3Wzu7P7pBw","3":200,"4":149},"3":{"1":"The Spruce Pets","2":"https://www.thesprucepets.com/whites-tree-frog-1236816","3":"A Guide to Caring for Pet White's Tree Frogs","4":"White's Tree Frogs' Behavior and Temperament","10":"JMVRbqkbIIvjsk"},"5":{"1":"CouNEYfSeOArmVa"}},{"1":{"1":"http://ichef.bbci.co.uk/wwfeatures/wm/live/1280_640/images/live/p0/2d/z3/p02dz3cy.jpg","3":1280,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0-DmARCSCVbR2JmafaUUp2xKyuJbYqxkvUi5BYaCiCQ6Y3gBa","3":200,"4":100},"3":{"1":"BBC.com","2":"http://www.bbc.com/earth/story/20141210-gorgeous-new-frogs-found-in-india","3":"BBC - Earth - Nine beautiful new frogs found in India's ...","4":"Nine beautiful new frogs found in India's Western Ghats","10":"olXkoxuJEnONJo"},"5":{"1":"XwtKwbtqWryTOGk"}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/2018/woodfrogsno1.jpg","3":800,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQaXimX_N6UETTMd8m_L0fNt23keTeateEaRjOtZ5Jf4UyOTKxS","3":200,"4":149},"3":{"1":"Phys.org","2":"https://phys.org/news/2018-05-wood-frogs-option-pee-winter.html","3":"Wood frogs' No. 1 option: Hold in pee all winter to survive","4":"","10":"CEqxlvQHXVHXVa"},"5":{"1":"bVFQHcQuFFJXjXe"}},{"1":{"1":"https://www.radionz.co.nz/assets/news_crops/51939/eight_col_Green_and_golden_bell_frog_-_Paul_Schilov__DOC.jpg?1518755893","3":720,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRArRLV-ZPjCLU1LlLyxwL2Qg_gq32A_qk1H6q2qZfHwyFFkCVoBw","3":200,"4":124},"3":{"1":"Radio NZ","2":"https://www.radionz.co.nz/news/national/350590/screeching-frogs-no-music-to-papamoa-s-ears","3":"Screeching frogs no music to Papamoa's ears | RNZ News","4":"Green and gold bell frogs: delightful to some; less so to others","10":"lmMkugWXrTFWkI"},"5":{"1":"vCKvENJeDtssMYw"}},{"1":{"1":"https://static1.squarespace.com/static/56648ab9e4b08333d1fdda0d/t/59d2de38a803bbf1d1a6c600/1506992166743/green_and_mink_CES.jpg?format=750w","3":750,"4":322},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRTDg-7IY9-O3b-eFzg5_UFgYlhu9ZZVGJk09Hbyjv9B2y3TffT","3":200,"4":85},"3":{"1":"Field Ecology","2":"https://www.fieldecology.com/blog/a-case-of-two-confusing-frogs","3":"Head to Head: A Case of Two Confusing Frogs — Field Ecology","4":"Left: Green frog ( Lithobates clamitans ). Right: Mink Frog ( Lithobates septentrionalis","10":"pUVUOdaTRwOyjh"},"5":{"1":"yHjTdyQroDgCWdN"}},{"1":{"1":"http://www.ipcc.ie/wp/wp-content/uploads/2012/11/bogfrog1.jpg","3":432,"4":324},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTdh7xGlfYKIZZoIX39opV4q6g3zMhcrxSKXDxXKhJM8mdHukTvYw","3":200,"4":149},"3":{"1":"Irish Peatland Conservation Council","2":"http://www.ipcc.ie/a-to-z-peatlands/frogs/","3":"Frog Factsheet - Irish Peatland Conservation Council ...","4":"Common Frog (Rana temporaria) in Lodge Bog, Co. Kildare","10":"raWUPnKvHoPLse"},"5":{"1":"wcXpPtnYsGdoKJF"}},{"1":{"1":"https://www.sciencedaily.com/images/2017/11/171129090421_1_540x360.jpg","3":536,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvlee0GkpwWYEUJKQoGPFpk2EG5FhGdkJFgd2H-zeYSNERweOS9A","3":200,"4":134},"3":{"1":"ScienceDaily","2":"https://www.sciencedaily.com/releases/2017/11/171129090421.htm","3":"Invasive frogs give invasive birds a boost in Hawaii ...","4":"Coquis ...","10":"KqBADfyUpcYQqH"},"5":{"1":"rBVhEPdGgtpfabn"}},{"1":{"1":"https://thumbs-prod.si-cdn.com/_zguUogCQ0DkXMlu0ktSFESkTJI=/800x600/filters:no_upscale()/https://public-media.smithsonianmag.com/filer/66/45/6645520f-0f24-4eb7-a788-4ca9ec2f61ed/14-fun-facts-about-frogs-550-419.jpg","3":550,"4":419},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQX1FgR9O8odOodFbUAzW-aIA9CrePB8C3WUy472Xlyta32Z5VN","3":200,"4":152},"3":{"1":"Smithsonian Magazine","2":"https://www.smithsonianmag.com/science-nature/14-fun-facts-about-frogs-180947089/","3":"14 Fun Facts About Frogs | Science | Smithsonian","4":"#4: When Darwin's frog tadpoles hatch, a male frog swallows the tadpoles","10":"RjFrolyMuvCBYP"},"5":{"1":"wEciuiYICEKAObu"}},{"1":{"1":"https://www.savethefrogs.com/images/events/day/2018/icon-save-the-frogs-day-2018-official-550.jpg","3":550,"4":413},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRibUOmBWEy-Cr0uMqu0tZT6s9ORQC2xzbGIgMASssmk7I_5QfV","3":200,"4":149},"3":{"2":"https://www.savethefrogs.com/","3":"SAVE THE FROGS! - Home","4":"icon save the frogs day 2018 official 550","10":"tYUCavGVyiNQiH"},"5":{"1":"UpPaLeYDytuQxjc"}},{"1":{"1":"https://www.environment.nsw.gov.au/-/media/OEH/Corporate-Site/Topics/Water/Wetlands/alpine-tree-frog-litoria-verreauxii-alpina-109924.jpg?h=585&w=810&hash=89D07E2F6959476D1F9FA0F15848FBC38932D6B4","3":810,"4":585},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRl84qjRzDxuAWE5CW28jJmJHKst8vnd-WBF8jZhP-xrNLaj3FV","3":200,"4":144},"3":{"1":"Office of Environment and Heritage - NSW Government","2":"https://www.environment.nsw.gov.au/topics/water/wetlands/plants-and-animals-in-wetlands/frogs","3":"Frogs in wetlands | NSW Environment & Heritage","4":"Alpine tree frog (Litoria verreauxii alpina) Photo: / Dr Dave Hunter","10":"NjrkvJayacyTXP"},"5":{"1":"BQliixBjqTljksX"}},{"1":{"1":"https://advancedtissue.com/wp-content/uploads/wound-healing-with-frog-skin.jpg","3":357,"4":242},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLyhCAwXxFitHayeYypMi2h03p7e0uAyUt7qVkb7HFXnjrVHnm","3":200,"4":135},"3":{"1":"Advanced Tissue","2":"https://advancedtissue.com/2015/07/frogs-and-wound-healing-whats-the-connection/","3":"Frogs and Wound Healing: What's the Connection?","4":"","10":"eQwjeANbJEgnpN"},"5":{"1":"JRXTEKjTTNmhMWe"}},{"1":{"1":"https://www.earthrangers.com/content/wildwire/green_frog_in_lake.jpg","3":640,"4":427},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSJKWWjU37-8POn1JDoz-F-YfCeTdS1K6CPB9XEzia2N3a9zt3O","3":200,"4":133},"3":{"1":"Earth Rangers","2":"https://www.earthrangers.com/wildwire/omg_animals/whats-so-great-about-frogs/","3":"What's So Great About Frogs? | Earth Rangers Wild Wire Blog","4":"What's So Great About Frogs?","10":"wLPhaSrclSwRIR"},"5":{"1":"fmuLWTTSNMbcpig"}},{"1":{"1":"http://www.pbs.org/wnet/nature/files/2014/06/frog-interactive.jpg","3":935,"4":526},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRcA8Iblt3ZgEQXiWQnGBqtiKMf8hZFf9CBYZQZSlztYk9-76bscA","3":200,"4":112},"3":{"1":"PBS","2":"http://www.pbs.org/wnet/nature/fabulous-frogs/8904/","3":"Fabulous Frogs | About | Nature | PBS","4":"Attenborough's Family of Fabulous Frogs","10":"BeRwlXHEGexsjP"},"5":{"1":"rIBinmesmIPwajF"}},{"1":{"1":"https://images.pexels.com/photos/104827/cat-pet-animal-domestic-104827.jpeg?auto=compress&cs=tinysrgb&h=350","3":527,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTw8Du8Ux7DmwbCFXbOkl-jyZ31neHXZPFLFNmLwThLTfd52sRK7g","3":200,"4":132},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"Grey and White Short Fur Cat","10":"TREAroYWuwFPbe"},"5":{"1":"kUtiOrdImbWFUov"}},{"1":{"1":"https://images.pexels.com/photos/617278/pexels-photo-617278.jpeg?auto=compress&cs=tinysrgb&h=350","3":528,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyvCOVHlpY5k9zMZYVgTZ3UrMBZcwRgkOFnmUuo80Ik7epQb7OgQ","3":200,"4":132},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"","10":"TsqdXdqOmrGDFt"},"5":{"1":"xStLTJfYSAJEtuf"}},{"1":{"1":"http://www.catster.com/wp-content/uploads/2017/08/A-fluffy-cat-looking-funny-surprised-or-concerned.jpg","3":600,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQYQo_3zC1FpgMmtbD0IDEVKiCMZ8H3SfbtBTOn42O8_fIj4fe8xQ","3":200,"4":133},"3":{"1":"Catster","2":"https://www.catster.com/cat-behavior/what-is-cat-flehmen-response","3":"What is a Cat Flehmen Response? - Catster","4":"","10":"PqnOEAEekXfkks"},"5":{"1":"KHGxdUcqYOSnNFb"}},{"1":{"1":"https://images.pexels.com/photos/20787/pexels-photo.jpg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTvSeOYRVExl062WjSramBG1P_LA-KUmQNFBD7s-Kqagn1XvJZn","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"Free stock photo of animal, pet, cat, adorable","10":"NNeOBwdWCVthYB"},"5":{"1":"kigYrKahGHXFYqm"}},{"1":{"1":"https://www.cats.org.uk/uploads/images/featurebox_sidebar_kids/grief-and-loss.jpg","3":582,"4":328},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRkadsYJoVDlWZ6IbaBDHQBCr8xqf9tghiiGd1kUosjQfa87EwDxA","3":200,"4":112},"3":{"2":"https://www.cats.org.uk/","3":"Cats Protection - UK's Largest Feline Welfare Charity","4":"Ginger cat","10":"JTPLwlndmEDniN"},"5":{"1":"FNDtweTpuRKfAaw"}},{"1":{"1":"https://www.readersdigest.ca/wp-content/uploads/sites/14/2011/01/4-ways-cheer-up-depressed-cat.jpg","3":1000,"4":700},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRzydEUK5PkeCEMWd5_FBN6rPwGUZE5NpniXIJvFolxCxP0k_Ya","3":200,"4":140},"3":{"1":"Reader's Digest Canada","2":"https://www.readersdigest.ca/home-garden/pets/4-ways-cheer-depressed-cat/","3":"How to Cheer Up a Depressed Cat","4":"4 Ways to Cheer Up a Depressed Cat","10":"ANUMBTkkqibRAD"},"5":{"1":"dOqNJVdHiXMiRAx"}},{"1":{"1":"https://s.hswstatic.com/gif/whiskers-sam.jpg","3":400,"4":272},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTQkLe7r0U3Tw6QYb4r4nDvtysFrTFA6kfkByQ-NMk64VqgPqrE","3":200,"4":136},"3":{"1":"Animals | HowStuffWorks","2":"https://animals.howstuffworks.com/pets/question592.htm","3":"Why do cats have whiskers? | HowStuffWorks","4":"A cat's whiskers are so sensitive that they can detect the slightest directional change in a","10":"lsrjwuKAaujOte"},"5":{"1":"HhtIvaifBWqrnAo"}},{"1":{"1":"https://i.ytimg.com/vi/I7jgu-8scIA/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQEq5El8D9lupke-0HjTPkPdfpS-KP8r4ic4Hutkz0lU-9VyX1Dcw","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=I7jgu-8scIA","3":"Animal Funny Cat Images, Pics, Videos","4":"Animal Funny Cat Images, Pics, Videos","10":"GFeWDFVjovWHnS"},"5":{"1":"RnAdHAIxVJeRIkj"},"7":{"1":{"11":{"1":"Animal Funny Cat Images, Pics, Videos","2":"A Funny Cat Videos Compilation, Cats Pictures, Images & Photos, cat photos free download, cat photos wallpaper, cat photos free, Cat Photos hd wallpapers fre...","3":"1:31","4":"102595","5":"1468454400000","6":"Real Video","7":"195","8":"1"}}}},{"1":{"1":"https://pbs.twimg.com/profile_images/378800000532546226/dbe5f0727b69487016ffd67a6689e75a_400x400.jpeg","3":400,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTbviSJcx2a4U01BRinV9aTIrdxUBzy9ZCHs2WdNG49aanJilZG","3":200,"4":200},"3":{"1":"Twitter","2":"https://twitter.com/cats","3":"Cats (@Cats) | Twitter","4":"Cats","10":"NdifjEknWFWSjU"},"5":{"1":"aTqngNpkitmabKn"}},{"1":{"1":"http://r.ddmcdn.com/s_f/o_1/cx_462/cy_245/cw_1349/ch_1349/w_720/APL/uploads/2015/06/caturday-shutterstock_149320799.jpg","3":720,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQS1O0mrtqT01GaiopVuQ6xn9yxiBGX8Vq4GZgq1bTcAbddeDAP","3":200,"4":200},"3":{"1":"Animal Planet","2":"http://www.animalplanet.com/pets/cats/","3":"Cats | Animal Planet","4":"Enter Your Cat In the #SaturdayCaturday Photo Contest","10":"emYEBtlYQpiAbm"},"5":{"1":"ivgquuqMrsiRMqY"}},{"1":{"1":"http://catsatthestudios.com/wp-content/uploads/2017/12/12920541_1345368955489850_5587934409579916708_n-2-960x410.jpg","3":960,"4":410},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2CCdsr45LaljC1fM0vx0IwzNWhFO4t6AlEmZlhsjrhmjbknh-","3":200,"4":85},"3":{"2":"http://catsatthestudios.com/","3":"Cats At The Studios","4":"","10":"CfMfbnycBdJMNW"},"5":{"1":"XxgiTeyyBktDYgI"}},{"1":{"1":"https://images.pexels.com/photos/326875/pexels-photo-326875.jpeg?auto=compress&cs=tinysrgb&h=350","3":525,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSAeaY5lovSy3u9wAf2A-evp1YJow4XxrBY2N49sitZikCt3odshg","3":200,"4":133},"3":{"1":"Pexels","2":"https://www.pexels.com/search/cat/","3":"446 Adorable Cat Pictures · Pexels · Free Stock Photos","4":"Cat Outdoors","10":"gDtGgtJFNRBnKs"},"5":{"1":"fqQxxvMBbmHnoGf"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/101438745-cat-conjunctivitis-causes.jpg","3":2673,"4":1797},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR-RyKa-DFc31yM6YnVxmbpH-Wh-TGhvGs-EbC9mIBiOSk2i3fIyw","3":200,"4":134},"3":{"1":"Petfinder","2":"https://www.petfinder.com/animal-shelters-and-rescues/fostering-cats/eight-reasons-you-can-foster-a-pet/","3":"Eight Reasons You Can Foster a Pet -- Even If You Think You ...","4":"Photo Credit: Thinkstock","10":"oVsrTAfMjhstNX"},"5":{"1":"RjxVkBxrJfxAkFb"}},{"1":{"1":"https://ichef.bbci.co.uk/images/ic/720x405/p0517py6.jpg","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTpvUB49_6VsNZeqiVuryzEbAgFrEFF-rz3xLc7KOtIA3rdtWmDzw","3":200,"4":112},"3":{"1":"BBC.com","2":"https://www.bbc.com/news/uk-scotland-39717634","3":"Should designer cats be banned?","4":"","10":"EVfyYqRfoeydmH"},"5":{"1":"tAjxscAqhLXqVDW"},"7":{"1":{"11":{"1":"Should designer cats be banned?","2":"The British Veterinary Association says irresponsible breeding of Scottish Fold cats should be banned.","3":"0:51","5":"1493251200000"}}}},{"1":{"1":"https://www.rd.com/wp-content/uploads/2016/04/01-cat-wants-to-tell-you-laptop.jpg","3":2400,"4":1600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTg6mKUF2r_U-_Nz10Wnk4TB5NLniqvO3oUHJW3at3cJp5UzffsMg","3":200,"4":133},"3":{"1":"Reader's Digest","2":"https://www.rd.com/advice/pets/how-to-decode-your-cats-behavior/","3":"Cat Behavior: Things Your Cat Wants to Tell You | Reader's Digest","4":"Please do not disturb my nap on your laptop or keyboard","10":"hPwqXxbtgVUEng"},"5":{"1":"ogVpkBcTvnUHKQg"}},{"1":{"1":"http://www.petsworld.in/blog/wp-content/uploads/2014/09/adorable-cat.jpg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTKr6YlGNsqgJzvgBBkq1648_HsuDizVn_ZXC6iQp9kjXFzLvs1BA","3":200,"4":112},"3":{"1":"Petsworld","2":"https://www.petsworld.in/blog/cat-pictures-funny-cute-adorable-and-all-time-favorite-cat-images.html","3":"Cat Pictures - All Time Favorite Images of Cats | Pets World","4":"Lovely ...","10":"VWyqcdIifiPAsd"},"5":{"1":"yEBvoqdpBJAADwy"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg","3":1200,"4":1199},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZCGyzQCpBWIboSErgUWkpGjp6NnHDRHNukRLST7JZ484gOrrN","3":200,"4":199},"3":{"1":"Wiktionary","2":"https://en.wiktionary.org/wiki/cat","3":"cat - Wiktionary","4":"","10":"qesKDTYqjNDBQr"},"5":{"1":"nFrmKJJBTxIDCyJ"}},{"1":{"1":"http://www.catster.com/wp-content/uploads/2017/10/A-kitten-meowing-with-his-mouth-open.jpg","3":600,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSe8Jz9HWznGSe5UmiA7aTpyr4h0ZbU6kMaNVtLoe1bzXJePHXG","3":200,"4":133},"3":{"1":"Catster","2":"https://www.catster.com/lifestyle/cat-wont-stop-meowing-reasons-for-cat-meowing","3":"Cat Won't Stop Meowing? 7 Reasons For All That Cat Meowing ...","4":"Cat Won't Stop Meowing? 7 Reasons For All That Cat Meowing - Catster","10":"rOLKXbEemWMNIf"},"5":{"1":"HwATpmJvGCtpMFg"}},{"1":{"1":"https://cdn-images-1.medium.com/max/1600/1*mONNI1lG9VuiqovpnYqicA.jpeg","3":1600,"4":911},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTBSLktez1akzZE9ow_QqBWlJ0tKmIEwPdNcsa6b-e3smz0Y5z9","3":200,"4":113},"3":{"1":"Hacker Noon","2":"https://hackernoon.com/a-guide-to-giving-your-cats-their-annual-performance-review-fbf14610305","3":"A guide to giving your cats their annual performance review","4":"","10":"awJBeEDkWAhkkj"},"5":{"1":"kTEHqrRYxvSjFcs"}},{"1":{"1":"https://www.aspca.org/sites/default/files/cat-care_urine-marking_main-image.jpg","3":1040,"4":500},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjlvHgqz9zSaliBXKKJRhynljd48S70CA-gQoVifLjXfFzXTex","3":200,"4":96},"3":{"1":"aspca","2":"https://www.aspca.org/pet-care/cat-care/common-cat-behavior-issues/urine-marking-cats","3":"Urine Marking in Cats | ASPCA","4":"Urine Marking in Cats","10":"BlkviGkEnuVojJ"},"5":{"1":"ecTTqLuGxKVUcJP"}},{"1":{"1":"https://media.istockphoto.com/photos/feline-picture-id512202044?k=6&m=512202044&s=612x612&w=0&h=VhTTUGX--kLckiNLgoEELarEJUgemigqLHkjo9-VVYE=","3":612,"4":408},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRZemwo9_Ur3LX9ZP9rk-ZskbIHKDD4nniZAymFOC1F6ot0HYQnA","3":200,"4":133},"3":{"1":"iStock","2":"https://www.istockphoto.com/sg/photos/cats","3":"Royalty Free Cats Pictures, Images and Stock Photos - iStock","4":"Feline stock photo","10":"iMthlYTpJYgtdI"},"5":{"1":"vuXdIGjRcfjLJAO"}},{"1":{"1":"https://www.bluecross.org.uk/sites/default/files/assets/images/cat%20tick.jpg","3":3200,"4":2595},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRlq8UxNpI3sv4Ld-h2o83xxncY9URNPXVbWTL4ECfxmuG0th4Rag","3":200,"4":162},"3":{"1":"Blue Cross","2":"https://www.bluecross.org.uk/pet-advice/cats-and-ticks","3":"Cats and ticks | How to spot and remove ticks from cats ...","4":"Cats and ticks | How to spot and remove ticks from cats | Blue Cross","10":"ghAtIlveaDuvKG"},"5":{"1":"PWaSYHMWopSrgKf"}},{"1":{"1":"https://www.shelterluv.com/sites/default/files/animal_pics/464/2016/11/25/22/20161125220040.png","3":1024,"4":1024},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRlaceNooMylVTLcMPyXpgPqt033qbXFseV3BQnOdwoOF4yWL02","3":200,"4":200},"3":{"1":"Austin Pets Alive!","2":"https://www.austinpetsalive.org/adopt/cats/","3":"Austin Pets Alive! Available Cats - Austin Pets Alive!","4":"Winnie","10":"mbCVTqDjXUGOqI"},"5":{"1":"RPbuTitwcJrARju"}},{"1":{"1":"http://www.petsworld.in/blog/wp-content/uploads/2014/09/cute-kittens.jpg","3":460,"4":276},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR7gRqfGF8AOysFCbPj7FQEkvPD7EJxficJ3hG3jAnKHqk7OSnDww","3":200,"4":120},"3":{"1":"Petsworld","2":"https://www.petsworld.in/blog/cat-pictures-funny-cute-adorable-and-all-time-favorite-cat-images.html","3":"Cat Pictures - All Time Favorite Images of Cats | Pets World","4":"A healthy young cat sitting","10":"DJCvRXDEMFHWFC"},"5":{"1":"JSCCVENnJxkeJkS"}},{"1":{"1":"https://news.nationalgeographic.com/content/dam/news/2018/05/17/you-can-train-your-cat/02-cat-training-NationalGeographic_1484324.ngsversion.1526587209178.adapt.1900.1.jpg","3":1900,"4":1266},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSiuxf2WZEzJwoVCSC87LI4g-KBxBnmld-Y9t7YuRLo9-H8ifC-Vw","3":200,"4":133},"3":{"1":"Latest Stories - National Geographic","2":"https://news.nationalgeographic.com/2018/05/animals-cats-training-pets/","3":"Why You're Probably Training Your Cat All Wrong","4":"","10":"VigYrdlMvakobR"},"5":{"1":"eiQWTqEIvjVgrgE"}},{"1":{"1":"https://www.argospetinsurance.co.uk/assets/uploads/2017/10/pexels-photo-416160.jpeg","3":3888,"4":2592},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPCS-aaaF7r3ypNGiFTi29miHqRFGgC7bnqTs7pw-71L0a-Mwnzw","3":200,"4":133},"3":{"1":"Argos® Pet Insurance","2":"https://www.argospetinsurance.co.uk/we-talk-pet/10-things-cats-do-to-show-they-love-you/","3":"10 Things Cats Do To Show They Love You | Argos Pet Insurance","4":"10 Things Cats Do To Show They Love You","10":"rYgIMLoQkrocaW"},"5":{"1":"kodUSpMtIyjumXF"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/112809642-fostering-cats-kittens-632x475.jpg","3":632,"4":475},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRFJ4TjzMvQCcqtVW8DjfRlgZRNhW0icO1WhlVJfaqr2jwjybd8","3":200,"4":150},"3":{"1":"Petfinder","2":"https://www.petfinder.com/animal-shelters-and-rescues/fostering-cats/fostering-cats-kittens/","3":"How to Be the Best Cat Foster Parent | Petfinder","4":"How to be the Best Cat Foster Parent","10":"RpYktfNNgFFUdM"},"5":{"1":"hVlXPYvfICAxvrP"}},{"1":{"1":"https://www.msah.com/sites/default/files/play-cats.jpg","3":632,"4":353},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtcDTBvP4A08AMSJl0Tk0_gLs_BjEnJ5-b1_2lvE3fSl_b0Yau","3":200,"4":111},"3":{"1":"Metairie Small Animal Hospital","2":"https://www.msah.com/services/cats/blog/playing-your-cats-%E2%80%93-every-day","3":"Playing with Your Cats – Every Day | MSAH - Metairie Small ...","4":"Playing with Your Cats – Every Day","10":"tsqryOecsuMihO"},"5":{"1":"BgVXTRcSCvUAcCp"}},{"1":{"1":"https://images.mentalfloss.com/sites/default/files/styles/mf_image_16x9/public/munchkinhed.png?itok=oeH4evcQ&resize=1100x1100","3":1100,"4":739},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQbjgFUFnqKqflsXhxpCLxR3RP5jl8OT0OVTCmr4zXIMpJEJ64","3":200,"4":134},"3":{"1":"Mental Floss","2":"http://mentalfloss.com/article/80011/7-short-facts-about-munchkin-cats","3":"7 Short Facts About Munchkin Cats | Mental Floss","4":"iStock","10":"oYOoVrtVhpULsR"},"5":{"1":"BwXdgvLEqHVuGgC"}},{"1":{"1":"https://cdn.pixabay.com/photo/2014/03/29/09/17/cat-300572_960_720.jpg","3":858,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRiXhgkC523CD5DIdvfwFl3G_S1Hc3oHzh8NUTXPeRSfYv1i8rA","3":200,"4":168},"3":{"1":"Pixabay","2":"https://pixabay.com/en/cat-animal-pet-cats-close-up-300572/","3":"Cat Animal Pet · Free photo on Pixabay","4":"cat animal pet cats close up","10":"OHrigtPprUbqIt"},"5":{"1":"UVwBxWqQQJpELdq"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/152964589-welcome-home-new-cat-632x475.jpg","3":632,"4":475},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1Ryrw8RcKm866nT-TcscKEKQUMvsrnhdNLT3y06nvxb-FhfDt","3":200,"4":150},"3":{"1":"Petfinder","2":"https://www.petfinder.com/cats/bringing-a-cat-home/welcome-home-new-cat/","3":"9 Ways to Welcome Home your New Cat | Petfinder","4":"9 Ways to Welcome Home your New Cat","10":"RbACJocuSEhqRa"},"5":{"1":"nJnuySiDYQJflde"}},{"1":{"1":"https://images.mentalfloss.com/sites/default/files/styles/mf_image_16x9/public/istock_000072600763_small.jpg?itok=LGQn4NSZ&resize=1100x1100","3":1100,"4":732},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR58HJCXknbahGz6Dc710zOivlLK6YAeGPkOsNWDo_k4RibzPJo","3":200,"4":133},"3":{"1":"Mental Floss","2":"http://mentalfloss.com/article/75833/celebrate-japans-cat-day-these-7-japanese-instagram-cats","3":"Celebrate Japan's Cat Day with These 7 Japanese Instagram ...","4":"iStock","10":"YUCVnPpvTavfJV"},"5":{"1":"qqAjxskMBsjupEQ"}},{"1":{"1":"https://thumbs-prod.si-cdn.com/3asSf7LmvyrY5m0-ggxJjrnd_DI=/800x600/filters:no_upscale()/https://public-media.smithsonianmag.com/filer/58/04/5804c840-3073-4ecf-a1d2-37808419fe93/gdahh5-wr.jpg","3":800,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQgwhDHRTam8t_vntCH3lU3vZ3A697TxZwdbMZwvMNuLSQ3TakM","3":200,"4":149},"3":{"1":"Smithsonian Magazine","2":"https://www.smithsonianmag.com/science-nature/theres-no-such-thing-hypoallergenic-cat-180968819/","3":"There's No Such Thing as a Hypoallergenic Cat | Science ...","4":"These unusual cats may have some advantages for allergic owners, but to call them hypoallergenic ...","10":"dmLuuTyYAvgAOD"},"5":{"1":"UwxXbIqINHIIvuh"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2012/11/91615172-find-a-lump-on-cats-skin-632x475.jpg","3":632,"4":475},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuxqqFdfLl9xgGpx0T4ErYHW7JQjhh2U5JDnTIm6lQQKuWlchb","3":200,"4":150},"3":{"1":"Petfinder","2":"https://www.petfinder.com/cats/","3":"Cats: Adoption, Bringing A Cat Home and Care","4":"","10":"uJOSoggYshTaUI"},"5":{"1":"waQpBnMWGyMBaQg"}},{"1":{"1":"https://ravishly-9ac9.kxcdn.com/cdn/farfuture/edYzCuowlJVcDos1RjXSa8_1o5tGDQBE4ebEFE6R1OE/mtime:1479930604/sites/default/files/maxresdefault_2.jpg","3":1600,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTOD7uc1bCe8jGOehxNSdsB3RewoVlWU-4EON8EXBLTIupS4YQS","3":200,"4":149},"3":{"1":"Ravishly","2":"https://ravishly.com/ravs-radar/your-cat-making-you-horny-what","3":"Is Your Cat Making You Horny? (What?) | Ravishly | Media Company","4":"Is Your Cat Making You Horny? (What?)","10":"rbYhAXkbgtNkAY"},"5":{"1":"SLwJxCswOkjIuxT"}},{"1":{"1":"http://www.animaltransportationassociation.org/Resources/Pictures/cat2.jpg","3":2560,"4":1600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRawXsBlHjuyVHNLuP5KWss9CfyB_LyXdOhy0lD1_aFl7w9fRO8","3":200,"4":124},"3":{"1":"Animal Transportation Association","2":"http://www.animaltransportationassociation.org/19Mar15_atawebcast","3":"Animal Transportation Association - Carrying Cats ...","4":"Carrying Cats: Considerations for Felines During Transit","10":"XhJwPxfLULYfXJ"},"5":{"1":"TbdLHqgvygvuRPl"}},{"1":{"1":"https://r.hswstatic.com/w_907/gif/tesla-cat.jpg","3":907,"4":510},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTXjhYG2c5myi8y_vziQOoCg_4WvcIHkAFKr9PpsJCUZSTKZtDD","3":200,"4":112},"3":{"1":"Animals | HowStuffWorks","2":"https://animals.howstuffworks.com/pets/teslas-cat-and-other-feline-fascinations.htm","3":"Nikola Tesla's Cat and Other Feline Fascinations | HowStuffWorks","4":"","10":"YPnSORjUREfjUP"},"5":{"1":"oUMXyuhFJqlfjTK"}},{"1":{"1":"https://i.ytimg.com/vi/zGcYabz3hYg/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTn95ROGrOOGyx5B8KPjaooWMaGSzy0o-UGgPWSMhbyj438qZcRYA","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=zGcYabz3hYg","3":"Sushi for Cats","4":"Sushi for Cats","10":"YDCvnorpNepngG"},"5":{"1":"bdssmGwdEiDSYRu"},"7":{"1":{"11":{"1":"Sushi for Cats","2":"►Patreon: https://www.patreon.com/JunsKitchen ►EQUIPMENT I use on my channel that you can buy online (Amazon affiliates links) ―Knife― Chef Knife: Sekimagoro...","3":"4:04","4":"10220867","5":"1500854400000","6":"JunsKitchen","7":"246890","8":"17056"}}}},{"1":{"1":"https://imgix.bustle.com/rehost/2017/5/30/f9fc3698-7ca6-40e5-975b-a63878357657.jpg","3":4288,"4":3216},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQs07PEKjsUcCKXIEeLpIYG_um9W8Z_tAUym4laTeMEQqxrnu2e_g","3":200,"4":149},"3":{"1":"Bustle","2":"https://www.bustle.com/articles/144945-6-reasons-cats-are-not-just-like-women-because-the-stereotypes-have-got-to-go","3":"6 Reasons Cats Are Not \"Just Like\" Women, Because The ...","4":"6 Reasons Cats Are Not \"Just Like\" Women, Because The Stereotypes Have Got To Go","10":"wUAIaceDiYwbQS"},"5":{"1":"bmGlSRwqgVAblRg"}},{"1":{"1":"https://www.shelterluv.com/sites/default/files/animal_pics/464/2016/11/25/21/20161125215406.png","3":1024,"4":1024},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSdoH6fd7-mpAM9EcN7wj2dmhgKcUBNrjPdLqruK--36bvJ6qr1xA","3":200,"4":200},"3":{"1":"Austin Pets Alive!","2":"https://www.austinpetsalive.org/adopt/cats/","3":"Austin Pets Alive! Available Cats - Austin Pets Alive!","4":"Ellsworth 5","10":"cjoDglsXHWwNUE"},"5":{"1":"yQFhabreXuYuacm"}},{"1":{"1":"http://r.ddmcdn.com/w_830/s_f/o_1/cx_0/cy_66/cw_288/ch_162/APL/uploads/2014/10/cat_5-1.jpg","3":830,"4":466},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQZr_w2kP8Wg9ESCJmgUCcsHj8zDgLM2cvpQbUTZt9LIdfHr0jF","3":200,"4":112},"3":{"1":"Animal Planet","2":"http://www.animalplanet.com/pets/cats/","3":"Cats | Animal Planet","4":"General Cat Care Tips","10":"DiVYMoamtOsUgN"},"5":{"1":"enxIppusXeDqqOC"}},{"1":{"1":"https://thumbs-prod.si-cdn.com/arpyrvhwaJWduhI6QhMe9Fo3858=/800x600/filters:no_upscale()/https://public-media.smithsonianmag.com/filer/20110913074012glowing_cat_web.jpg","3":470,"4":251},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSbVN3ZxmtUTLNkABAQstR_IcVm3nGK9FBZxwfhOWU5mjGjn0DN","3":200,"4":106},"3":{"1":"Smithsonian Magazine","2":"https://www.smithsonianmag.com/science-nature/the-glow-in-the-dark-kitty-77372763/","3":"The Glow-In-The-Dark Kitty | Science | Smithsonian","4":"A fluorescent green cat could help in the fight against AIDS","10":"uIAMvvVbSXvIUH"},"5":{"1":"yBiLdBepktKCObP"}},{"1":{"1":"https://icatcare.org/sites/default/files/kcfinder/images/images/aggressive-red-cat.jpg","3":490,"4":326},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRH8x6rsyQTeKuDhI4Y3q_xjU5PYPQljhfvxy_1BjkvQKGBp4PT","3":200,"4":133},"3":{"1":"International Cat Care","2":"https://icatcare.org/advice/problem-behaviour/aggression-between-cats","3":"Aggression between cats | International Cat Care","4":"Aggression between cats","10":"usEbeWdynUvWJO"},"5":{"1":"lGvbsGkSBdmGRuJ"}},{"1":{"1":"http://cdn0.wideopenpets.com/wp-content/uploads/2018/02/AdobeStock_181671521.jpeg","3":4272,"4":2848},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT2c7pm89h2GgdUOys6nBz1omEtspO1aguhl7DPUj5gR_aImYFm","3":200,"4":133},"3":{"1":"Wide Open Pets","2":"https://www.wideopenpets.com/8-affectionate-cat-breeds-that-actually-love-to-cuddle/","3":"9 Affectionate Cat Breeds That Actually Love to Cuddle","4":"Girl holds in his hands a beautiful Siamese cat","10":"MhRqTMHQiSQTSq"},"5":{"1":"oxLmbcibtEAPGRO"}},{"1":{"1":"https://www.thesprucepets.com/thmb/7kVrWdBf13osb9nYJ-4D2yPAwfQ=/425x326/filters:no_upscale():max_bytes(150000):strip_icc()/GettyImages-466792657-59cef0d6c412440010be728c.jpg","3":425,"4":326},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9-jeA_VEFnUUwJzRS9dTC2FRcAiNZboqIhgAGCPI_Gd_G6b8e","3":200,"4":153},"3":{"1":"The Spruce Pets","2":"https://www.thesprucepets.com/cats-4162124","3":"How to Be a Responsible Cat Owner","4":"Cats","10":"rTaXFKEVvQoCxn"},"5":{"1":"UjCFlVxhlVPNwjF"}},{"1":{"1":"https://ichef.bbci.co.uk/news/624/cpsprodpb/305D/production/_103218321_gettyimages-134815902.jpg","3":624,"4":351},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSOL8rHQ04-vwxJqVlRqN-H0hK4kUwnmckDMP0zTvKXJy1iG3Nc","3":200,"4":112},"3":{"1":"BBC","2":"https://www.bbc.co.uk/news/world-asia-45347136","3":"Why a village in New Zealand is trying to ban all cats - BBC News","4":"Stock image of a cat outside in flower bed","10":"NrUvUBQTcTCSiL"},"5":{"1":"YHAqNrBWfXaEMVb"}},{"1":{"1":"https://atlantahumane.org/wp-content/uploads/2012/08/adopt-a-cat-1200x630.png","3":1200,"4":630},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR5TH43KjTPkOGsCqmw8hjBcrHO-erQelSZ0FWlA29r0zOoJW92hg","3":200,"4":105},"3":{"1":"Atlanta Humane Society","2":"https://atlantahumane.org/adopt/cats/","3":"Adopt a Cat or Kitten","4":"Adopt a Cat","10":"knAaYJckcivLmR"},"5":{"1":"TsjhVmbdmbVoHoD"}},{"1":{"1":"http://www.dreams.metroeve.com/wp-content/uploads/2017/04/dreams.metroeve_cats-dreams-meaning.jpg","3":592,"4":304},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTNet_foDzEqA51kZf7y8R5kOWFEUKK9F9ICsbZYr4bOTLhMeZ5","3":200,"4":102},"3":{"1":"Dream Dictionary","2":"http://www.dreams.metroeve.com/cats/","3":"Cats dreams meaning - Interpretation and Meaning","4":"Cats dreams meaning","10":"pYiiOfEsHvASoL"},"5":{"1":"yitDHIAaQOOdaRT"}},{"1":{"1":"https://www.petful.com/wp-content/uploads/2011/10/cats-cuddling-funny-850x539.jpg","3":850,"4":539},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQOMIoyg_pWYw3k1LS2ryBqbL8tjvfoqv9-OTFEXTplBM5yJx7l","3":200,"4":126},"3":{"1":"Petful","2":"https://www.petful.com/behaviors/how-do-cats-communicate-with-each-other/","3":"How Do Cats Communicate With Each Other? - Petful","4":"3 Ways of Communication Between Cats","10":"LQaqSqLhLnBUfW"},"5":{"1":"bUTftQCTbDFlsdb"}},{"1":{"1":"http://www.petsworld.in/blog/wp-content/uploads/2014/09/cat.jpg","3":400,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS2WhOti17crdhQ5YaH0tWnaPwy-EL7rVEWpyH_VABFAmjfA8mZKA","3":133,"4":200},"3":{"1":"Petsworld","2":"https://www.petsworld.in/blog/cat-pictures-funny-cute-adorable-and-all-time-favorite-cat-images.html","3":"Cat Pictures - All Time Favorite Images of Cats | Pets World","4":"A Cat lover's delight","10":"MIeOauNTFxruUL"},"5":{"1":"ynywhMRTGlWxicb"}},{"1":{"1":"http://sciencenordic.com/sites/default/files/imagecache/620x/kat_astma_videnskab.jpg","3":620,"4":412},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTKXdoXAT7VqIMXRBmjSFJDcgeP1cDrLo3O_bGAGSgSJ79PcRRo","3":200,"4":132},"3":{"1":"ScienceNordic","2":"http://sciencenordic.com/cats-protect-newborns-against-asthma","3":"Cats protect newborns against asthma | ScienceNordic","4":"","10":"ebtAfFAJkMedhO"},"5":{"1":"TbgPbTfAlYCrRsQ"}},{"1":{"1":"http://www.catcareofvinings.com/blog/wp-content/uploads/2017/05/CCV_iStock-619079366-2000x1331.jpg","3":2000,"4":1331},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9KUm5nLqQKG0OAzhoQxzDccFO7C0MmTanEFr-DHp3mHqaQQpmow","3":200,"4":133},"3":{"1":"Cat Care of Vinings","2":"http://www.catcareofvinings.com/blog/cat-thinking/","3":"Deep Thoughts: What is Your Cat Thinking Throughout the Day ...","4":"cat care","10":"qQBClwCNpdCxEj"},"5":{"1":"lQNOMbAUqgcyqYD"}},{"1":{"1":"https://images.immediate.co.uk/volatile/sites/4/2018/08/iStock_000044061370_Medium-fa5f8aa.jpg?quality=45&crop=5px,17px,929px,400px&resize=960,413","3":960,"4":413},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSgIMohz552yuAneZIasvHIn5KJKN4L5IK7jc6rSluz48MIov2BvQ","3":200,"4":85},"3":{"1":"BBC Focus Magazine","2":"https://www.sciencefocus.com/nature/is-it-true-that-most-ginger-cats-are-male/","3":"Is it true that most ginger cats are male? - Science Focus ...","4":"Is it true that most ginger cats are male? © iStock","10":"IsSWOkewoBVoyN"},"5":{"1":"rvWVNrAfIXvtwcE"}},{"1":{"1":"https://cdn.theatlantic.com/assets/media/img/mt/2017/06/shutterstock_319985324/lead_720_405.jpg?mod=1533691890","3":720,"4":405},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQYRaFuQDancwY5rr0g1FR48S7rbXhI1cPh0UHMtjTNKpGRoH7WSw","3":200,"4":112},"3":{"1":"The Atlantic","2":"https://www.theatlantic.com/science/archive/2017/06/cat-domination/530685/","3":"How Cats Used Humans to Conquer the World - The Atlantic","4":"Cat jumps in air","10":"vUEGUDKayXFWYs"},"5":{"1":"ROWDGLyjMsbVgwt"}},{"1":{"1":"https://imagesvc.timeincapp.com/v3/mm/image?url=https%3A%2F%2Fpeopledotcom.files.wordpress.com%2F2018%2F08%2F34982856_913748398827212_5249963337373974528_n.jpg%3Fw%3D1800&w=700&c=sc&poi=face&q=85","3":700,"4":700},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTsKnyOc-9bYJXBDCVmG6xK9sBNmbi2myY2zFL8u8FaDkmajd8BAQ","3":200,"4":200},"3":{"1":"People Magazine","2":"https://people.com/pets/iambronsoncat-33-pound-cat-weight-loss-journey/","3":"iambronsoncat: Fat Cat on Instagram Losing Weight | PEOPLE.com","4":"Bronson the cat/Instagram","10":"uYuIUYkriwkfEs"},"5":{"1":"bcluKuWcQjWgSGD"}},{"1":{"1":"https://static.boredpanda.com/blog/wp-content/uploads/2017/07/funny-tiny-face-cats-photoshop-battle-11-596db6bf66c5b__605.jpg","3":605,"4":409},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR5eo0CbpzMdi0QofgC2v0k6G089ljeSEqjlTBdjVQ8AXas3dANIQ","3":200,"4":134},"3":{"1":"Bored Panda","2":"https://www.boredpanda.com/funny-tiny-face-cats-photoshop-battle/","3":"People Are 'Breeding' Cats With Tiny Faces, And We Can't ...","4":"Cats With Tiny Faces","10":"KhasNKHCjkpiOK"},"5":{"1":"BRXGRcorLPkYToy"}},{"1":{"1":"https://d17fnq9dkz9hgj.cloudfront.net/uploads/2013/09/cat-black-superstitious-fcs-cat-myths-162286659.jpg","3":632,"4":353},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRoAclhVC7gbhlRQOYDDcxQpjCH0_0aI0BIftb1X0JixabN0-KuSg","3":200,"4":111},"3":{"1":"Petfinder","2":"https://www.petfinder.com/cats/","3":"Cats: Adoption, Bringing A Cat Home and Care","4":"black cat","10":"jgvbapwuhVjMDF"},"5":{"1":"LIPTYfsRLcsdxef"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Cat_eating_a_rabbit.jpeg/220px-Cat_eating_a_rabbit.jpeg","3":220,"4":187},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTM2lD05jXtOZSV7AuO3hvNvDWkObMlWiC97BQtxlT0RGL_LH4zjQ","3":200,"4":170},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Cat","3":"Cat - Wikipedia","4":"Impact on prey species","10":"MvcDWiVddakwSO"},"5":{"1":"DdiScMFQsSrAqKm"}},{"1":{"1":"https://assets3.thrillist.com/v1/image/2696152/size/tmg-article_tall;jpeg_quality=20.jpg","3":640,"4":853},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRuPeTpZbE5BZKB-5-exd6Ecv4fY1BlGVHZ1leqZN2Zu0vHdPhigw","3":149,"4":200},"3":{"1":"The Dodo","2":"https://www.thedodo.com/close-to-home/what-to-do-stray-cat","3":"What To Do If You Find A Stray Cat - The Dodo","4":"Share on Facebook ...","10":"gQcCvghMoTEaHn"},"5":{"1":"xHsHCsPpDjcLGUm"}},{"1":{"1":"https://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/article_thumbnails/video/wibbitz/wbz-when-cats-sneeze.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSoBO_x3BJPFuVLwm8fyi2dbu0KIAmw32oWZn8hyckaIzj4Ain9","3":200,"4":112},"3":{"1":"Pet WebMD","2":"https://pets.webmd.com/cats/why-cats-sneeze","3":"Why Cats Sneeze","4":"","10":"lIiLWrpodGqLbE"},"5":{"1":"tcsvWDVrmXKLuXN"},"7":{"1":{"11":{"1":"Why Cats Sneeze","2":"WebMD explains why cats sneeze.","3":"0:49"}}}},{"1":{"1":"https://imagesvc.timeincapp.com/v3/mm/image?url=https%3A%2F%2Fimages.hellogiggles.com%2Fuploads%2F2015%2F12%2F11083247%2Fcat.jpg&w=700&c=sc&poi=face&q=85","3":700,"4":467},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTyqlbEiXO_ve-xH0IupMWF_e06JxgJ1zW99lvaKeClbZopfbLt","3":200,"4":133},"3":{"1":"HelloGiggles","2":"https://hellogiggles.com/news/10-cat-puns-will-ever-need/","3":"The only 10 cat puns you will ever need - HelloGiggles","4":"","10":"FKYqmXrURSmLOp"},"5":{"1":"octogHMDQOutVmB"}},{"1":{"1":"https://lh3.googleusercontent.com/aR34MxRBretppyADbJcfqIZp-LraO1ELhk00lTZw0Q7MF1ebUKZeggeQkjBuZCCmYRSYNzr8=w640-h400-e365","3":640,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ6uXSCu96cLwMFotwgSKSr5TWi3PGa-RoBaNJLp6CXb4UzJw-f","3":200,"4":124},"3":{"1":"Chrome - Google","2":"https://chrome.google.com/webstore/detail/tabby-cat/mefhakmgclhhfbdadeojlkbllmecialg","3":"Tabby Cat - Chrome Web Store","4":"","10":"oMpQUFDpPDlshm"},"5":{"1":"otuueNvgwlPdxEJ"}},{"1":{"1":"https://cdn.cnn.com/cnnnext/dam/assets/150324154028-16-internet-cats-restricted-super-169.jpg","3":1100,"4":619},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQqyAVnpTM5-KWPFFMnxMBPcmj-D8uuBwiY8TXf2odz72qQPGpx","3":200,"4":112},"3":{"1":"CNN.com","2":"https://www.cnn.com/2015/09/08/health/what-your-cat-is-trying-to-say/index.html","3":"This is what your cat is really trying to say - CNN","4":":","1 ounce (30 grams) dark chocolate","Dark Chocolate Mousse<\\/em>:","10 ounces (280 grams) semisweet or bittersweet chocolate (not to exceed 62% cacao), coarsely chopped","10 tablespoons (140 grams) unsalted butter"],"5":"Named “Dessert of the Year” by San Francisco Focusmagazine in 1987, this dessert was all the ...","7":"Serves 10-12"}}}},{"1":{"1":"https://www.curiouscuisiniere.com/wp-content/uploads/2018/02/Mousse-Au-Chocolate-French-Chocolate-Mousse-Image-4974.21.jpg","3":500,"4":742},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3kiWXUN_7SlC9wX39ePh2JGlKgD2J2sS6ILh1ElE4qLVDmNPP","3":134,"4":200},"3":{"1":"Curious Cuisiniere","2":"https://www.curiouscuisiniere.com/french-chocolate-mousse/","3":"Mousse Au Chocolate (Easy French Chocolate Mousse)","4":"If you love creamy, rich, dark chocolate, then Mousse Au Chocolat is for","10":"FCADlrWhXEqKDa"},"5":{"1":"itIHFxSjrbREsRr"},"7":{"1":{"9":{"1":4.119999885559082,"2":17,"3":"Mousse Au Chocolate (Easy French Chocolate Mousse)","4":["6 oz bittersweet chocolate","4 eggs (divided, at room temp*)","1 Tbsp sugar","1 tsp pure vanilla extract","Pinch salt"],"5":"If you love creamy, rich, dark chocolate, then Mousse Au Chocolat is for you. This classic French ...","6":"10 min","7":"4 people"}}}},{"1":{"1":"http://2.bp.blogspot.com/-s7Y4M28grcg/UeB2Uhr8PzI/AAAAAAAASu0/x_x4lNbGY_Y/s1600/Chocolate+Mousse+1.jpg","3":1600,"4":1359},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQDBfF5H0pz1oKGMbq4_M0oEilrat37uEQluSYVL8jHv-AFO67T","3":200,"4":169},"3":{"1":"Kitchen Simmer","2":"http://www.kitchensimmer.com/2013/07/2-ingredient-chocolate-mousse-made-with.html","3":"Kitchen Simmer: 2 Ingredient Chocolate Mousse made with with Tofu","4":"2 Ingredient Chocolate Mousse made with with Tofu","10":"nEQPNkHkyYrqOo"},"5":{"1":"RHQXOaTULmPkXPy"}},{"1":{"1":"https://images-gmi-pmc.edge-generalmills.com/a3dab23d-e8ba-4c6a-91e8-d665f435b7b9.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTL9fZkba8Rj5BLfKkLvNn-VH6nm_SAq_CZOc-ZqG0YSHECNxfh","3":200,"4":112},"3":{"1":"Betty Crocker","2":"https://www.bettycrocker.com/recipes/chocolate-mousse-torte/66b1d719-9130-466c-80e3-a43ba54957b3","3":"Chocolate Mousse Torte","4":"Chocolate Mousse Torte","10":"XXqhHhnhMHlkYc"},"5":{"1":"LjVOJVXvNqQnUMi"},"7":{"1":{"9":{"1":4.0,"2":122,"3":"Chocolate Mousse Torte","4":["1 pouch (10.25 oz) Betty Crocker™ fudge brownie mix Save $","1/4 cup vegetable oil Save $","1/4 cup water Save $","1 egg Save $","2 bags (11.5 oz each) semisweet chocolate chunks (3 1/2 cups) Save $"],"5":"You've gotta try this fudgy brownie with creamy mousse all wrapped up into one deliciously decadent ...","6":"5 hr 10 min","7":"16"}}}},{"1":{"1":"https://www.recipetineats.com/wp-content/uploads/2018/09/Chocolate-Mousse_9.jpg","3":900,"4":1125},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSRTllyEUXSRStN0A_5HquR1O4e6RpolMgGA3vXMK2tzXjWIoWj","3":160,"4":200},"3":{"1":"RecipeTin Eats","2":"https://www.recipetineats.com/chocolate-mousse/","3":"Chocolate Mousse","4":"Chocolate Mousse in glasses topped with a dollop of cream and chocolate shavings, ready to","10":"VbHnKQYaoxNJTA"},"5":{"1":"DCTUOiQAUcmrbAs"},"7":{"1":{"9":{"1":5.0,"2":18,"3":"Chocolate Mousse","4":["3 eggs ((~55g/2 oz each))","125 g / 4.5 oz dark chocolate (, bittersweet / 70% cocoa (Note 1))","10 g / 0.3 oz / 2 tsp unsalted butter","125 ml / 1/2 cup cream (, full fat (Note 2))","35 g / 3 tbsp caster sugar ((superfine white sugar))"],"5":"Recipe video above. Light and airy yet rich, the iconic Chocolate Mousse is actually quite straight ...","6":"20 min","7":"4"}}}},{"1":{"1":"https://thebakermama.com/wp-content/uploads/2017/12/fullsizeoutput_b92f.jpg","3":800,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSBGlZFrrxhyoI7vVCRXpvPnSEFZd5QRtWLyVxO5gwhuVcmGNPY","3":133,"4":200},"3":{"1":"The BakerMama","2":"https://thebakermama.com/recipes/triple-chocolate-mousse-cheesecake/","3":"Triple Chocolate Mousse Cheesecake","4":"Triple Chocolate Mousse Cheesecake","10":"SnmceCuTRPAycF"},"5":{"1":"nKaKgkQmJyQDnYx"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse Cheesecake","4":["20 Oreo cookies","4 tablespoons (1/2 stick) unsalted butter, melted","2 (8-ounce) packages cream cheese, at room temperature","⅔ cup sugar","⅔ cup sour cream"],"5":"Get your chocolate fix with this Triple Chocolate Mousse Cheesecake that will wow the crowd for any ...","6":"1 hr 30 min","7":"One 9-inch Cheesecake (12 slices)"}}}},{"1":{"1":"https://www.ihearteating.com/wp-content/uploads/2016/06/chocolate-mousse-1000-wm.jpg","3":1000,"4":1545},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTkg6HRrZv_PdRsTXh7mQ1-sIu5sdTrsD47NOoaLPJh06-TJ1HMDA","3":129,"4":200},"3":{"1":"I Heart Eating","2":"https://www.ihearteating.com/chocolate-mousse-recipe/","3":"Chocolate Mousse","4":"Chocolate Mousse Recipe","10":"AmryhXhIwGlTTu"},"5":{"1":"bhcysqtAhQCxRBI"},"7":{"1":{"9":{"1":5.0,"2":3,"3":"Chocolate Mousse","4":["4 ounces bittersweet baking chocolate (60% cacao, chopped)","4 ounces semisweet baking chocolate (chopped)","1 1/2 cups mini marshmallows","1/2 cup milk","2 1/2 cups heavy cream"],"5":"Light and creamy chocolate mousse","6":"10 min","7":"10 servings"}}}},{"1":{"1":"https://media4.s-nbcnews.com/j/newscms/2018_17/1334122/chocolate-mousse-today-180423-tease_6844913865e80416b7725903c4c7cc1d.today-inline-large.jpg","3":700,"4":394},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRflwrv45xsumf5B5_bw0R9XQlW-zazCnn9Mhwf1BGUKN5yd0O5","3":200,"4":112},"3":{"1":"Today Show","2":"https://www.today.com/recipes/nigella-lawson-s-chocolate-olive-oil-mousse-recipe-t127449","3":"Nigella Lawson's Chocolate Olive Oil Mousse","4":"TODAY","10":"gghNMUXymYQvqp"},"5":{"1":"pAkxRTmVUHIwFVx"},"7":{"1":{"9":{"1":3.71875,"2":32,"3":"Nigella Lawson's Chocolate Olive Oil Mousse","4":["6 ounces bittersweet chocolate, preferably 70% cocoa solids, roughly chopped","7 tablespoons extra virgin olive oil","4 large eggs, at room temperature, separated","1 pinch, plus 1/4 teaspoon sea salt flakes","1/4 cup superfine sugar"],"5":"You don't need to turn on the oven to make this sweet, easy and deeply chocolatey treat."}}}},{"1":{"1":"http://www.notenoughcinnamon.com/wp-content/uploads/2018/02/A-rich-and-silky-healthy-chocolate-mousse-made-with-a-22secret22-ingredient-%E2%80%93-avocado.-Super-easy-to-make-and-perfect-for-Valentines-Day-Vegan-refined-sugar-free-1.jpg","3":800,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRFF0p8GA87czK48anmffnMfkYWuaSnmkBIQGV2JANtC-Xol7V2fw","3":133,"4":200},"3":{"1":"Not Enough Cinnamon","2":"https://www.notenoughcinnamon.com/healthy-avocado-chocolate-mousse/","3":"Healthy Avocado Chocolate Mousse","4":"A rich and silky healthy chocolate mousse made with a secret ingredient – avocado. Super","10":"ytDhNkolXKLxrT"},"5":{"1":"VyGFADafQvGeeOG"},"7":{"1":{"9":{"1":5.0,"2":6,"3":"Healthy Avocado Chocolate Mousse","4":["4 oz - 120 g dark or semisweet chocolate, roughly chopped (you can also use dark chocolate chips)","2 large ripe avocados (about 8 oz - 225 g each), halved and pitted.","3 tbsp unsweetened cocoa powder","1/4 cup almond milk (or your favorite milk)","1 tsp pure vanilla extract"],"5":"A rich and silky healthy chocolate mousse made with a \"secret\" ingredient – avocado. Super easy to ...","6":"2 hr","7":"4"}}}},{"1":{"1":"https://www.browneyedbaker.com/wp-content/uploads/2013/04/chocolate-mousse-34-600.jpg","3":600,"4":889},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSaWSLB9Ts2EbM91_3zSx8pgPzf_x9OL6kFP5X_ca3Ugt5vcBAy5A","3":134,"4":200},"3":{"1":"Brown Eyed Baker","2":"https://www.browneyedbaker.com/chocolate-mousse-recipe/","3":"Dark Chocolate Mousse","4":"Dark Chocolate Mousse Recipe","10":"nmptWAfCYnJDno"},"5":{"1":"JAntLcGdsxJmiqL"},"7":{"1":{"9":{"3":"Dark Chocolate Mousse","4":["8 ounces bittersweet chocolate (60% cacao), finely chopped","5 tablespoons water","2 tablespoons Dutch-process cocoa powder","1 tablespoon brandy","1 teaspoon instant espresso powder"],"5":"A fabulous recipe for classic chocolate mousse.","6":"3 hr 30 min","7":"6 to 8 servings"}}}},{"1":{"1":"https://www.runningtothekitchen.com/wp-content/uploads/2016/02/Paleo-Chocolate-Mousse-1.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSfqPMOL-Lac3lKJI5YjgsS_DVLZOKqzQlKloR4VKClGPRjSqSu","3":133,"4":200},"3":{"1":"Running to the Kitchen","2":"https://www.runningtothekitchen.com/paleo-chocolate-mousse/","3":"Paleo Chocolate Mousse - Running to the Kitchen®","4":"This paleo chocolate mousse is decadent and creamy. It's topped with a quick strawberry chia","10":"YeEQQIjcNBiSHI"},"5":{"1":"mAqvnPwpUuebaSd"}},{"1":{"1":"https://www.delscookingtwist.com/wp-content/uploads/2018/04/Dark-Chocolate-Mousse_1043b.jpg","3":1600,"4":2320},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRXp--t9ud0joIn-mnU8DeajJP8eCHiDEUpRhzho6wnM0vRXwyGHQ","3":137,"4":200},"3":{"1":"Del's cooking twist","2":"https://www.delscookingtwist.com/2018/04/17/dark-chocolate-mousse-the-one-and-only/","3":"Dark Chocolate Mousse (the one and only)","4":"Dark Chocolate Mousse","10":"CKhvAHDMsduJRj"},"5":{"1":"uEAVsXuOFtKbynA"},"7":{"1":{"9":{"3":"Dark Chocolate Mousse (the one and only)","4":["7 oz (200g) dark chocolate, at 60% cocoa","1 large Tablespoon (20g) salted butter","6 large eggs, whites and yolks apart","1 pinch of salt"],"5":"The one and only chocolate mousse I ever make. Just three ingredients, no added sugar, and it's ...","6":"12 min","7":"4-6 servings"}}}},{"1":{"1":"https://hips.hearstapps.com/del.h-cdn.co/assets/18/10/1520286740-delish-strawberry-chocolate-mousse-cake-pinterest-still003.jpg?crop=0.999546485260771xw:1xh;center,top&resize=480:*","3":480,"4":719},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSqbPMc0kFlmM1Jt1exaJlR4xyXlorUszqLCRMNswhO500O8fHIrg","3":133,"4":200},"3":{"1":"Delish.com","2":"https://www.delish.com/cooking/recipe-ideas/recipes/a58500/strawberry-chocolate-mousse-cake-recipe/","3":"Strawberry Chocolate Mousse Cake","4":"Strawberry Chocolate Mousse Cake","10":"KvrLMxhNhLTjNu"},"5":{"1":"ptRLDVduVvnFFlW"},"7":{"1":{"9":{"3":"Strawberry Chocolate Mousse Cake","4":["Cooking spray, for pan","24 Oreos, crushed","6 tbsp. butter, melted","Pinch kosher salt","2 tsp. gelatin"],"5":"Impress everyone with this Strawberry Chocolate Mousse Cake from Delish.com.","6":"6 hr 30 min","7":"8-10"}}}},{"1":{"1":"https://www.simplyrecipes.com/wp-content/uploads/2005/10/chocolate-mousse-horiz-a-1800.jpg","3":1800,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQltJG3psfbGppJn0PErmPZohv2G8yav3UpThzPmjPpOzqBMuK0rQ","3":200,"4":133},"3":{"1":"Simply Recipes","2":"https://www.simplyrecipes.com/recipes/chocolate_mousse/","3":"Classic Chocolate Mousse","4":"Chocolate Mousse","10":"LNouTHKdMOycCp"},"5":{"1":"LRpylOyFmkAQMVv"},"7":{"1":{"9":{"1":5.0,"2":70,"3":"Classic Chocolate Mousse","4":["4 1/2 ounces bittersweet chocolate, finely chopped","2 Tbsp (1 ounce) unsalted butter, cubed","2 Tbsp espresso or very strong coffee (I used decaf espresso from a local Starbucks)","1 cup cold heavy whipping cream","3 large eggs, separated*"],"5":"Chocolate mousse is a great dessert for entertaining because 1) it looks pretty, 2) everyone gets ...","6":"8 hr 35 min","7":"Serves 5 to 8"}}}},{"1":{"1":"https://du7ybees82p4m.cloudfront.net/5954ce66d1cd02.64778504.jpg?width=910&height=512","3":910,"4":512},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQWCfvpEyu6fgnZVdGPOOL70Tuxoa8xk7b9yN5LO_QElmJOMJYc7Q","3":200,"4":112},"3":{"1":"Sorted Food","2":"https://sortedfood.com/recipe/chocolatemoussecakerecipe","3":"Triple Chocolate Mousse Cake","4":"","10":"myAAryDxieDtBP"},"5":{"1":"LNJudVEEKMwjVIR"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse Cake","4":["100 ml water","1 tsp vanilla extract","70 g caster sugar","150 g unsalted butter","70 g soft brown sugar"],"5":"What's better than a chocolate mousse cake? A triple chocolate mousse cake! Try this delicious ..."}}}},{"1":{"1":"https://www.barbarabakes.com/wp-content/uploads/2015/10/Chocolate-Mousse-Cups-Barbara-Bakes.jpg","3":640,"4":427},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPJ0YD0gdjbG_RI-4XBf_oYs2nor4rOr6Nl1nCf0W2d-Xh2GXtiw","3":200,"4":133},"3":{"1":"Barbara Bakes","2":"https://www.barbarabakes.com/chocolate-mousse-cups-and-ubud-bali/","3":"Chocolate Mousse Cups and Ubud","4":"A pretty, ruffled chocolate cup filled with a rich, creamy milk chocolate mousse topped","10":"cgoLLugSFUfoRv"},"5":{"1":"TNTlYSgeuvompMV"},"7":{"1":{"9":{"3":"Chocolate Mousse Cups and Ubud","5":"A pretty, ruffled chocolate cup filled with a rich, creamy milk chocolate mousse topped with a sweet ...","7":"8 servings"}}}},{"1":{"1":"https://i1.wp.com/cafedelites.com/wp-content/uploads/2018/01/Low-Carb-Double-Chocoloate-Mousse-Coconut-IMAGE-22.jpg?resize=980%2C1470&ssl=1","3":980,"4":1470},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR4uZa1UWLSlYEd0JPPgBQP_h0SdFU65SzmdWufd1XpQrpqxz7zHQ","3":133,"4":200},"3":{"1":"Cafe Delites","2":"https://cafedelites.com/3-ingredient-double-chocolate-mousse-low-carb/","3":"3-Ingredient Double Chocolate Mousse (Low Carb) + VIDEO ...","4":"3-Ingredient Double Chocolate Mousse (Low Carb and Dairy Free) | http:","10":"iENUfhBLxcKFBT"},"5":{"1":"rvfaeHHmMinDFQn"}},{"1":{"1":"https://i1.wp.com/myvibrantkitchen.com/wp-content/uploads/2017/12/vegan-aquafaba-easy-fluffy-chocolate-mousse-1-1.jpg?resize=900%2C1350","3":900,"4":1350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTQM6xf7BEk6-koJKGbwy9NFbgwbAVWQ0dyn6dSy7ngOoaNh_XAvQ","3":133,"4":200},"3":{"1":"My Vibrant Kitchen","2":"http://myvibrantkitchen.com/easy-vegan-aquafaba-chocolate-mousse/","3":"Easy Vegan Aquafaba Chocolate Mousse","4":"Easy Vegan Aquafaba Chocolate Mousse","10":"GQjqdpLHCxFfan"},"5":{"1":"BYOHYQHTrMWrfGK"},"7":{"1":{"9":{"1":4.5,"2":2,"3":"Easy Vegan Aquafaba Chocolate Mousse","4":["70 ml soy milk or coconut milk","185 g dairy-free dark chocolate","240 ml chickpea water (aka aquafaba)","½ tsp lemon juice (optional)","1 Tbsp white caster sugar"],"5":"This post has been along time coming… I’ve lost count of all the times I’ve…","6":"25 min","7":"4-5"}}}},{"1":{"1":"https://cdn.cpnscdn.com/static.coupons.com/ext/kitchme/images/recipes/800x1200/no-bake-death-by-chocolate-mousse-pie_44591.jpg","3":800,"4":1200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQog0BDyBHjvza7PY32qBbhNfsldmZoM4m6VBfWVmuuJV2jToJKHw","3":133,"4":200},"3":{"1":"KitchMe","2":"http://www.kitchme.com/recipes/no-bake-death-by-chocolate-mousse-pie","3":"No Bake Death by Chocolate Mousse Pie","4":"","10":"UmAfDvWwIqwEuv"},"5":{"1":"UHplnYftdTJtbmk"},"7":{"1":{"9":{"3":"No Bake Death by Chocolate Mousse Pie","4":["21 cream filled chocolate sandwich cookies, such as Oreo","1⁄4 cup butter, melted","1 cup heavy cream,","1 package (12 oz) semi-sweet chocolate chips,","1 tsp vanilla extract,"],"5":"Recipe including course(s): Dessert; and ingredients: butter, chocolate sandwich cookies, heavy ...","6":"30 min","7":"Serves 8"}}}},{"1":{"1":"https://www.daringgourmet.com/wp-content/uploads/2017/12/White-Chocolate-Mousse-6-cropped.jpg","3":1024,"4":736},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSaOIXpH0XPJzc22BR6NEoEcb8IS8-akAT4nPmoODOgGpBtl5VTQ","3":200,"4":143},"3":{"1":"The Daring Gourmet","2":"https://www.daringgourmet.com/easy-white-chocolate-mousse/","3":"Easy White Chocolate Mousse","4":"... festive or special occasion, give this Easy White Chocolate Mousse a try!","10":"xcyoPPhgKVJyHy"},"5":{"1":"xrhvLuXEKqVrkeM"},"7":{"1":{"9":{"1":5.0,"2":2,"3":"Easy White Chocolate Mousse","4":["2 cups heavy whipping cream","12 ounces white chocolate chips or bar broken into chunks","3 tablespoons powdered (confectioner's) sugar","Edible Glitter, optional ((for sprinkling))"],"5":"Easy, quick and classy, this deliciously rich and creamy White Chocolate Mousse makes an elegant ...","7":"8 servings"}}}},{"1":{"1":"https://i1.wp.com/www.feastingonfruit.com/wp-content/uploads/2017/02/Chocolate-Mousse-Cake-8.jpg?resize=980%2C1470&ssl=1","3":980,"4":1470},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQMf6veD5XuruR71A-tJ3ySKIB1Cs10emN7IB42qDYz_MDwaGNM","3":133,"4":200},"3":{"1":"Feasting on Fruit","2":"https://www.feastingonfruit.com/chocolate-mousse-cake/","3":"Chocolate Mousse Cake","4":"Low-Fat Chocolate Mousse CakeSkip to Recipe","10":"lmMUDWOwAnEMvJ"},"5":{"1":"SnlTUklXjjOGHkx"},"7":{"1":{"9":{"1":4.800000190734863,"2":12,"3":"Chocolate Mousse Cake","4":["2 cups almonds","2 tbsp maple syrup","1 tbsp water (if needed)","1 cup baked and mashed sweet potato","1 cup Medjool dates"],"5":"This insanely decadent Chocolate Mousse Cake may taste like fudge frosting but is made from just a ...","6":"1 hr 5 min","7":"6 \" round cake"}}}},{"1":{"1":"https://static01.nyt.com/images/2015/10/26/dining/26COOKING-FLOURLESSCHOCCAKE1/26COOKING-FLOURLESSCHOCCAKE1-articleLarge.jpg","3":600,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQjBhgcxDj21rYQRKLe9Gg5evkd5jQOixJMy-VwlyHSj8KGa_KI","3":200,"4":133},"3":{"1":"NYT Cooking - The New York Times","2":"https://cooking.nytimes.com/recipes/11001-intense-chocolate-mousse-cake","3":"Intense Chocolate Mousse Cake","4":"Intense Chocolate Mousse Cake","10":"EbcrrHfipRSWqR"},"5":{"1":"fBQbuMkMKyLnDGP"},"7":{"1":{"9":{"1":5.0,"2":813,"3":"Intense Chocolate Mousse Cake","4":["10 ounces bittersweet chocolate","9 tablespoons unsalted butter","6 large eggs, room temperature and separated","Pinch of salt","¾ cup sugar"],"5":"There is very little that needs to be said about a chocolate mousse cake. This one lives up to its ...","6":"1 hr 5 min","7":"One 9-inch cake"}}}},{"1":{"1":"https://www.tasteofhome.com/wp-content/uploads/2018/01/Triple-Chocolate-Mousse-Torte_EXPS_SDAM18_212092_C11_29_2b-696x696.jpg","3":696,"4":696},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcShzAmAXBRyn_Ha_oUg9dAvQ2mLbk6wdDAaOXA1AYdu8m_f3CeM","3":200,"4":200},"3":{"1":"Taste of Home","2":"https://www.tasteofhome.com/recipes/triple-chocolate-mousse-torte/","3":"Triple Chocolate Mousse Torte","4":"Triple Chocolate Mousse Torte","10":"lpqFjVlbVwUsmQ"},"5":{"1":"FXeXclSsYAkJYGJ"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse Torte","4":["18 Oreo cookies","1/3 cup butter, melted","6 teaspoons unflavored gelatin, divided","3 tablespoons cold water, divided","5 ounces bittersweet chocolate, chopped"],"5":"When it's too hot to bake something sweet, but you're craving chocolate, my triple chocolate mousse ...","6":"1 hr 55 min","7":"16 servings."}}}},{"1":{"1":"https://thelemonbowl.com/wp-content/uploads/2017/02/Vegan-Chocolate-Mousse-a-healthy-dessert-recipe.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSFzpfvIEbn_mhVOAm9OjBWPF_H9NTJ1-vKJdUO3My1ZFFGbLhmAQ","3":133,"4":200},"3":{"1":"The Lemon Bowl","2":"https://thelemonbowl.com/vegan-chocolate-mousse/","3":"Vegan Chocolate Mousse","4":"Vegan Chocolate Mousse","10":"nexwCurfkLKRIu"},"5":{"1":"jlqYrUVtWGuHNgT"},"7":{"1":{"9":{"1":4.0,"2":3,"3":"Vegan Chocolate Mousse","4":["4 ounces bittersweet chocolate chips (60-70%) (or vegan chocolate chips)","3 ripe avocados (pitted)","1/2 cup full-fat coconut milk (or milk of choice)","1/4 cup cocoa powder","1 teaspoon vanilla"],"5":"This rich and creamy vegan chocolate mousse recipe is made with avocado and topped with whipped ...","6":"10 min","7":"4"}}}},{"1":{"1":"https://4ebr313dmbeg4df5hm1uys8p-wpengine.netdna-ssl.com/wp-content/uploads/2014/03/chocolatemousse.jpg","3":570,"4":858},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTvzjlCDnc5wQiWcReLod0HYyWIHmZptf0xUR9G_d_kTHgBG59U","3":132,"4":200},"3":{"1":"Cookies & Cups","2":"https://cookiesandcups.com/easy-chocolate-mousse/","3":"Easy Chocolate Mousse","4":"Easy Chocolate Mousse in a jar","10":"phRcSUkOtBoamm"},"5":{"1":"YgYntDuGWruYycG"},"7":{"1":{"9":{"1":4.599999904632568,"2":19,"3":"Easy Chocolate Mousse","4":["2 eggs","1/4 cups granulated sugar","2 1/2 cups cold heavy whipping cream, divided","6 oz semi-sweet chocolate (about 1 cup semi-sweet chips)"],"5":"makes 8 servings","7":"serves 8"}}}},{"1":{"1":"https://www.chatelaine.com/wp-content/uploads/2017/12/chocolate-mousse-1.jpg","3":800,"4":800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRN_vKJ6e5dD_T6QWbgKK9WcVGjmc90HcH-AQ5S4C_JGR9BRcTc","3":200,"4":200},"3":{"1":"Chatelaine","2":"https://www.chatelaine.com/recipe/desserts/chocolate-mousse-with-whipped-cream/","3":"Chocolate mousse with whipped cream","4":"IngredientsInstructionsNutrition","10":"nBaqtfTuCRvgTP"},"5":{"1":"auraBvchaAqAolJ"},"7":{"1":{"9":{"3":"Chocolate mousse with whipped cream","4":["100 g bittersweet chocolate, chopped (2/3 cup)","60 g semi-sweet chocolate, chopped (1/3 cup)","3 tbsp unsalted butter, cubed","1 tsp vanilla","1/4 tsp salt"],"6":"15 min","7":"8"}}}},{"1":{"1":"https://www.lifeloveandsugar.com/wp-content/uploads/2017/10/Baileys-Chocolate-Mousse-Brownie-Cake4.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTosET9j-NPzteHftDDcr0sVQhS_bgH3tdUh1YK5UFwrV5OyGKT","3":133,"4":200},"3":{"1":"Life Love and Sugar","2":"https://www.lifeloveandsugar.com/2017/10/16/baileys-chocolate-mousse-brownie-cake/","3":"Baileys Chocolate Mousse Brownie Cake","4":"Baileys Chocolate Mousse Brownie Cake - a dense chocolate brownie topped with Baileys chocolate ...","10":"MSYtxTYyAERGjI"},"5":{"1":"QdMTifpDBByVkpn"},"7":{"1":{"9":{"3":"Baileys Chocolate Mousse Brownie Cake","4":["1 1/2 cups (336g) unsalted butter, melted","2 cups (414g) sugar","2 tsp vanilla extract","6 tbsp Baileys Irish Cream","4 eggs"],"5":"This Baileys Chocolate Mousse Brownie Cake is our chocolate and Baileys cake dreams come true! With ...","7":"12-15 Slices"}}}},{"1":{"1":"https://cookinglsl.com/wp-content/uploads/2017/02/baileys-mousse-1-1-660x925.jpg","3":660,"4":925},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQeV4NgUDvRBtYdRb_9EA5KjR95bQ2qg4osoxeDWhCBFMG-75h8","3":142,"4":200},"3":{"1":"Cooking LSL","2":"https://cookinglsl.com/easy-baileys-chocolate-mousse-recipe/","3":"Easy Baileys Chocolate Mousse Recipe","4":"Easy Baileys Chocolate Mousse Recipe","10":"epIkUtAcFpsbue"},"5":{"1":"iYUCCKccmaXMhHE"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Easy Baileys Chocolate Mousse Recipe","4":["3/4 cup Baileys (, divided)","2 cups heavy whipping cream (, divided)","200 grams / 1 1/4 cup semi-sweet chocolate ((or chocolate chips))","1 tbsp gelatin","1/4 cup cold water"],"5":"... - a boozy dessert for chocolate lovers. Made with Baileys Irish Cream. Just in time for St ...","6":"25 min","7":"6"}}}},{"1":{"1":"https://beyondfrosting.com/wp-content/uploads/2017/03/Oreo-Chocolate-Mousse-Pie-029.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR2IfvrAtLKO1wTECgB7eLcodLShil4OxELsIF0b8nW-KNji7AX","3":133,"4":200},"3":{"1":"Beyond Frosting","2":"https://beyondfrosting.com/2017/03/13/no-bake-oreo-chocolate-mousse-pie/","3":"No-Bake Oreo Chocolate Mousse Pie","4":"It's all about the layers with this No-Bake Oreo Chocolate Mousse Pie. The","10":"hDIMNfEVVEdIwl"},"5":{"1":"yKnwKkQbGCKVlfB"},"7":{"1":{"9":{"3":"No-Bake Oreo Chocolate Mousse Pie","4":["For the crust","2 pkgs Oreo Cookies (14.03 oz), divided","8 tablespoons unsalted butter","For the chocolate layer","1 tablespoons cold water"],"5":"It’s all about the layers with this No-Bake Oreo Chocolate Mousse Pie. The thick Oreo crust is ...","6":"4 hr 30 min"}}}},{"1":{"1":"https://www.bbcgoodfood.com/sites/default/files/styles/recipe/public/recipe/recipe-image/2017/12/chocolate-mousse.jpg?itok=v4PsEZ95","3":500,"4":454},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjqfdHQs0pRv0EAdRPIXtKXZSVydYrTaoC7sjoOlZxcrClTA60Ng","3":200,"4":181},"3":{"1":"BBC Good Food","2":"https://www.bbcgoodfood.com/recipes/easy-chocolate-mousse-","3":"Easy chocolate mousse","4":"Easy chocolate mousse","10":"tAvSFgdIXcWSdD"},"5":{"1":"RFFfGOUBWehRIwM"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Easy chocolate mousse","4":["150g 70% dark chocolate, plus extra to serve","6 egg whites","2 tbsp golden caster sugar","4 tbsp crème fraîcheand grated chocolate, to serve"],"5":"Make this classic chocolate dessert in minutes with just a few ingredients – light yet delicious. ...","6":"7 min","7":"Serves 4"}}}},{"1":{"1":"https://static01.nyt.com/images/2018/05/08/dining/08COOKING-NOBAKEMOUSSE1/08COOKING-NOBAKEMOUSSE1-articleLarge-v2.jpg","3":600,"4":414},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3_8y3xenuC37UJsbcl7eFzp4oNhvBM7n6pWeNH3FXCkmoKLVo","3":200,"4":137},"3":{"1":"NYT Cooking - The New York Times","2":"https://cooking.nytimes.com/recipes/1019316-no-bake-chocolate-mousse-bars","3":"No-Bake Chocolate Mousse Bars","4":"No-Bake Chocolate Mousse Bars","10":"jMfULOMAKMKyvc"},"5":{"1":"APAWdyGGVoPVGdK"},"7":{"1":{"9":{"1":4.0,"2":660,"3":"No-Bake Chocolate Mousse Bars","4":["18 whole graham crackers (about 9 1/2 ounces/269 grams)","8 tablespoons/113 grams unsalted butter (1 stick), melted","2 tablespoons granulated sugar","¼ teaspoon kosher salt","1 pound/454 grams semisweet chocolate, finely chopped"],"5":"Ethereal and ready to melt in your mouth, chocolate mousse bars are easy to make and even easier to ...","6":"30 min","7":"24 servings"}}}},{"1":{"1":"https://www.simplystacie.net/wp-content/uploads/2015/09/Chocoholics-Chocolate-Mousse-Cake-wide.jpg","3":736,"4":552},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTc8X8ax7pAeyj8cUviUNQ0tGs1EHoM4ssApf6FCvCGZBb1VqdF","3":200,"4":149},"3":{"1":"Simply Stacie","2":"https://www.simplystacie.net/2015/11/chocoholics-chocolate-mousse-cake/","3":"Chocoholics Chocolate Mousse Cake","4":"Chocoholics Chocolate Mousse Cake - Luscious and rich, this dessert recipe will satisfy your sweet","10":"qXNFdcwHLgSQcR"},"5":{"1":"PmBvFwnmYUMsLKV"},"7":{"1":{"9":{"3":"Chocoholics Chocolate Mousse Cake","5":"Luscious and rich, this Chocoholics Chocolate Mousse Cake will satisfy your sweet tooth!","6":"45 min","7":"6"}}}},{"1":{"1":"https://food-images.files.bbci.co.uk/food/recipes/celebration_chocolate_26103_16x9.jpg","3":5760,"4":3240},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQEOqt14rbAy7SyDf5C8iZrqZu6nI8rYgUvQyI68tsGKb4nionf0Q","3":200,"4":112},"3":{"1":"BBC.com","2":"https://www.bbc.com/food/recipes/celebration_chocolate_26103","3":"Celebration chocolate mousse cake","4":"","10":"CWatRJQqmSvgYE"},"5":{"1":"kHcSSinPLWLfHpR"},"7":{"1":{"9":{"3":"Celebration chocolate mousse cake","4":["25g/1oz cocoa powder, plus extra for dusting","3 tbsp boiling water","100g/3½oz caster sugar","100g/3½oz self-raising flour","1 level tsp baking powder"],"5":"Mary Berry's rich, indulgent dessert is fit for a celebration and makes a stunning centrepiece., ...","6":"12 hr 30 min","7":"Serves 8-10"}}}},{"1":{"1":"https://www.afarmgirlsdabbles.com/wp-content/uploads/2015/07/Dark-Chocolate-Mousse-Cups_AFarmgirlsDabbles_AFD-600x900.jpg","3":600,"4":900},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRgdqtv_Cj2AhDxF7cB2gOi1aEGwJWkFPraLwVhF0scdQbBZ32T","3":133,"4":200},"3":{"1":"A Farmgirl's Dabbles","2":"https://www.afarmgirlsdabbles.com/chocolate-mousse-cups-recipe/","3":"Chocolate Mousse Cups","4":"Chocolate Mousse Cups","10":"iEjeNoadQdnDKP"},"5":{"1":"MIMiGtNACwSGsPC"},"7":{"1":{"9":{"3":"Chocolate Mousse Cups","4":["1/2 c. cold heavy cream","1 tsp. pure vanilla extract","4 large egg yolks","1 T. butter, at room temperature","1/4 c. espresso or strong coffee, at room temperature"],"5":"With this recipe, anyone and everyone is able to make delicious, savor-every-spoonful Chocolate ...","7":"6 servings"}}}},{"1":{"1":"https://www.spendwithpennies.com/wp-content/uploads/2013/01/Easy-Chocolate-Mousse-spendwithpennies-23.jpg","3":700,"4":1050},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR_CLPJ2xigxExPYAcr08k9EOf5vx_tpNB30RyhhqihMIHV_iQ5","3":133,"4":200},"3":{"1":"Spend with Pennies","2":"https://www.spendwithpennies.com/chocolate-mousse-in-1-minute/","3":"Easy Chocolate Mousse","4":"dessert cups filled with chocolate mousse, whipped cream and a raspberry on top","10":"QTcuoXeToOLeBp"},"5":{"1":"sQhduDgpkeIFqJR"},"7":{"1":{"9":{"1":5.0,"2":1,"3":"Easy Chocolate Mousse","4":["1 box instant chocolate pudding mix (4 serving size)","2 tablespoons unsweetened cocoa powder","2 1/2 cups heavy cream (30-35% mf)","1 cup whipped topping (optional)"],"5":"A rich creamy chocolate dessert that takes just a couple of minutes to prepare!","6":"2 min","7":"4 servings"}}}},{"1":{"1":"https://www.kunersfoods.com/wp-content/uploads/2017/10/ChocMousse2_720x478_72_RGB-515x342.jpg","3":515,"4":342},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS-y8NR-2I7fwSVMC0mQyM7dCTTK0H0JaxXTY_SXXneDd8AticffA","3":200,"4":132},"3":{"1":"Kuner's Foods","2":"https://www.kunersfoods.com/recipe/black-bean-chocolate-mousse/","3":"Black Bean Chocolate Mousse","4":"Black Bean Chocolate Mousse Servings: 5 (about 4oz each) Prep Time: 10 minutes Total Time: 1 hour 10 ...","10":"uKGicOGawSIaHx"},"5":{"1":"RQrBYmSDpOiEOnh"},"7":{"1":{"9":{"1":4.199999809265137,"2":5,"3":"Black Bean Chocolate Mousse","7":"5 (about 4oz each)"}}}},{"1":{"1":"https://www.halfbakedharvest.com/wp-content/uploads/2017/01/Chocolate-Lovers-Greek-Yogurt-Chocolate-Mousse-Cake-4.jpg","3":1200,"4":1800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTVc47mXlT63i5lHx1nQ_OBA9aRTF7ITemEejQPK215gMzdI_xB","3":133,"4":200},"3":{"1":"Half Baked Harvest","2":"https://www.halfbakedharvest.com/chocolate-lovers-greek-yogurt-chocolate-mousse-cake/","3":"Chocolate Lovers Greek Yogurt Chocolate Mousse Cake.","4":"Chocolate Lovers Greek Yogurt Chocolate Mousse Cake | halfbakedharvest.com @hbharvest","10":"iWycSGhrbDsnet"},"5":{"1":"oGRyjdfvlWJPpKW"},"7":{"1":{"9":{"1":3.7799999713897705,"2":18,"3":"Chocolate Lovers Greek Yogurt Chocolate Mousse Cake.","4":["1 cup raw walnuts","1/2 cup raw (unsweetened coconut flakes)","1 1/2 cups pitted (packed dates (about 10 ounces))","1/2 cup cacao powder or unsweetened cocoa powder","pinch of flaky sea salt"],"5":"Chocolate lovers...this one is for you.","6":"1 hr 43 min","7":"8 Servings"}}}},{"1":{"1":"https://images.food52.com/YFlDbJw8F8GFolGJepl1XXj5Un8=/753x502/eb5300fa-1862-4ec7-8e73-5da38c2a1638--IMG_8848_web.jpg","3":753,"4":502},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTMzy0H1PjQ7_6fYzOUPcVKIzwW4yc0ET3SzcF1pYH_0jZu7TaBmg","3":200,"4":133},"3":{"1":"Food52","2":"https://food52.com/recipes/73238-eggless-chocolate-mousse-cake","3":"Eggless chocolate mousse cake","4":"Eggless chocolate mousse cake","10":"OuRVdvQyJNFjIu"},"5":{"1":"FyvDAuHOSkXHVxg"},"7":{"1":{"9":{"3":"Eggless chocolate mousse cake","4":["CHOCOLATE CAKE","1 cup granulated sugar","3/4 cup all purpose flour","2 tablespoons all purpose flour","1/4 cup unsweetened cocoa powder"],"7":"Makes 6 mini cakes"}}}},{"1":{"1":"https://hungryhappenings.com/wp-content/uploads/2018/01/chocolate-mousse-cup-hearts-recipe-1.jpg","3":680,"4":680},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRQjD9OHvXLwUnN6Za9mGKLPTU8D0vUPIlNv5JcaU1XNIcw8ovRDw","3":200,"4":200},"3":{"1":"Hungry Happenings","2":"https://hungryhappenings.com/chocolate-mousse-cup-hearts/","3":"Chocolate Mousse Cup Hearts","4":"Chocolate Mousse Cup Hearts","10":"CTTGmjORhBeLnB"},"5":{"1":"CnaIBrYDIVYnYBP"},"7":{"1":{"9":{"3":"Chocolate Mousse Cup Hearts","4":["24 ounces melted and tempered pure dark chocolate or melted confectionery coating/candy melts","3 tablespoons water","3 tablespoons sugar","3 large egg yolks","1/2 cup heavy whipping cream"],"5":"Chocolate heart shaped bowls filled with luxuriously smooth chocolate mousse.","6":"35 min","7":"12"}}}},{"1":{"1":"https://flockler.com/thumbs/sites/192/jo_easy5_hero_cherries_chocolate_mousse_538_landscape_s600x600_c3467x2025_l0x190.jpg","3":600,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQA3S7YmPon_WNoASN_w3uVMr10QQjo_TAcYldF-5941POWlNXFag","3":200,"4":200},"3":{"1":"The Happy Foodie","2":"https://thehappyfoodie.co.uk/recipes/cherry-chocolate-mousse","3":"Cherry Chocolate Mousse","4":"Cherry Chocolate Mousse","10":"jXYXPYAtvXUoDt"},"5":{"1":"GHiNCjnUlImEjQr"},"7":{"1":{"9":{"3":"Cherry Chocolate Mousse","4":["200g dark chocolate (70%)","1 x 400g tin of black pitted cherries in syrup","200ml double cream","4 large eggs","2 tbsp golden caster sugar"],"5":"Jamie Oliver's recipe for Cherry Chocolate Mousse, from the book of his Channel 4 series, Jamie's ...","6":"30 min"}}}},{"1":{"1":"https://www.cookingclassy.com/wp-content/uploads/2015/06/easy-chocolate-mousse9-srgb..jpg","3":575,"4":857},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRaxSGuYQTWN0IdkLiCm5bbCgB8yC-YSJBOgwmYrCWUl3lGV6II-A","3":134,"4":200},"3":{"1":"Cooking Classy","2":"https://www.cookingclassy.com/easy-chocolate-mousse/","3":"Easy Chocolate Mousse","4":"... Easy Chocolate Mousse | Cooking Classy ...","10":"cRfmXtkoQaNPij"},"5":{"1":"HKuHLnhAgfeTxUT"},"7":{"1":{"9":{"3":"Easy Chocolate Mousse","4":["3 1/2 cups mini marshmallows","1/4 cup salted butter (, diced into 1 tbsp pieces)","9 oz good quality semi-sweet chocolate (, chopped into small pieces)","1/4 cup hot water","1 cup heavy cream"],"5":"Yield: 6 servings","6":"50 min"}}}},{"1":{"1":"https://omgchocolatedesserts.com/wp-content/uploads/2017/07/Triple-Chocolate-Mouse-Cake-Minis-1.jpg","3":800,"4":1138},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT6kthHuIBjSaP2JLUjxI1Z1vlnK2P0g1RBkwwfY7DQetSR_YAE","3":140,"4":200},"3":{"1":"OMG Chocolate Desserts","2":"https://omgchocolatedesserts.com/triple-chocolate-mousse-cake-minis/","3":"Triple Chocolate Mousse Cake Minis","4":"Triple Chocolate Mousse Cake Minis are rich and decadent layered dessert with brownie bottom, dark, ...","10":"OHvXlsLUnBRFyW"},"5":{"1":"gupsGQNOgSdbvFu"},"7":{"1":{"9":{"3":"Triple Chocolate Mousse Cake Minis","4":["1/2 cup unsalted butter","7 oz. quality semi-sweet chocolate-chopped","¾ cup granulated sugar","2 large eggs","1 teaspoon vanilla"],"5":"Chocolate lovers dream come true!!!Triple Chocolate Mousse Cake Minis are rich and decadent layered ..."}}}},{"1":{"1":"https://truffle-assets.imgix.net/pxqrocxwsjcc_1ExNApZWGsM6EgqwoySYou_eggless-chocolate-mousse_landscapeThumbnail_en.jpeg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS5peaglYDX3baXp9UgU9SLARAbGBl_qHWcj1Ez_In2WrZ7l16erw","3":200,"4":112},"3":{"1":"Tastemade","2":"https://www.tastemade.com/videos/eggless-chocolate-mousse","3":"Eggless Chocolate Mousse","4":"","10":"aHQpAUdxysLqDE"},"5":{"1":"SFepbKWHigjGXwP"},"7":{"1":{"9":{"3":"Eggless Chocolate Mousse","4":["3 ounces dark chocolate (over 65 percent cacao content)","7 fluid ounces heavy cream, very cold","For plating:","Little Mason jars","One can coconut milk, frozen so cream separates to the top, for garnish"],"5":"Satisfy your chocolate addiction with this ridiculously easy mousse."}}}},{"1":{"1":"https://homecookingadventure.com/images/recipes/triple_chocolate_mousse_cake_main.jpg","3":635,"4":423},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR8sE2etmZ0WERxbuYUZmisFmy_QG5iPuDSSDL8HrzYWaJ549Jb","3":200,"4":133},"3":{"1":"Home Cooking Adventure","2":"https://www.homecookingadventure.com/recipes/no-bake-triple-chocolate-mousse-cake","3":"No-Bake Triple Chocolate Mousse Cake","4":"No-Bake Triple Chocolate Mousse Cake","10":"KbEUPKybruvwgj"},"5":{"1":"OvBJSbpjEucCXqd"},"7":{"1":{"9":{"3":"No-Bake Triple Chocolate Mousse Cake","4":["7 oz (200g) oreo cookies","4 tbsp (60g) butter, melted","5 oz (150g) semi-sweet chocolate","1/2 cup (120g) whipping cream","2/3 cup (160g) whipping cream (35% fat), chilled"]}}}},{"1":{"1":"https://cdn.apartmenttherapy.info/image/fetch/f_auto,q_45,w_600,h_750,c_fit,fl_strip_profile/https://s3.amazonaws.com/pixtruder/original_images/4292f1cd22e7a55c5c4b34e83dc164d78c62503d","3":500,"4":750},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRiy5TAVbUDNxzQZqFJcdSN3ni5mMS4PCN1Cm6UtXACsvKGtfaROA","3":133,"4":200},"3":{"1":"The Kitchn","2":"https://www.thekitchn.com/chrissy-teigen-chocolate-mousse-recipe-review-261645","3":"Chrissy Teigen's Three-Ingredient Chocolate Mousse with Salty Rice Krispies–Hazelnut Crackle","4":"","10":"xTcuUtyOnbIiVX"},"5":{"1":"WgjVRQiSQDUBoJq"},"7":{"1":{"9":{"1":4.5,"2":17,"3":"Chrissy Teigen's Three-Ingredient Chocolate Mousse with Salty Rice Krispies–Hazelnut Crackle","4":["1 cup good-quality chocolate chips or coarsely chopped chocolate (6 ounces)","1/3 cup whole milk","3/4 cup cold heavy cream","Oil, for the pan","2/3 cup granulated sugar"],"5":"You'll want to make this every night.","6":"15 min","7":"Serves 4"}}}},{"1":{"1":"https://www.tasteofhome.com/wp-content/uploads/2018/01/Orange-Chocolate-Mousse-Mirror-Cake_EXPS_THCOM17_210212_D09_12_2b-1-696x696.jpg","3":696,"4":696},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR6CYbfzoObEcoBYObETRy19c6O_FuZlIfT-eNs_vD8s-OqymCC7w","3":200,"4":200},"3":{"1":"Taste of Home","2":"https://www.tasteofhome.com/recipes/orange-chocolate-mousse-mirror-cake/","3":"Orange Chocolate Mousse Mirror Cake","4":"Orange Chocolate Mousse Mirror Cake","10":"bccutWebwVRlAR"},"5":{"1":"jHtuHqOpytcagyC"},"7":{"1":{"9":{"1":4.0,"2":1,"3":"Orange Chocolate Mousse Mirror Cake","4":["2 cups crushed Oreo cookies (about 20 cookies)","1 teaspoon grated orange zest","1/4 cup butter, melted","FILLING:","1 envelope unflavored gelatin"],"5":"A shiny, mirror-like orange glaze covers a chocolate mousse cake to create a delicious show-stopping ...","6":"45 min","7":"16 servings."}}}},{"1":{"1":"https://thethingswellmake.com/wp-content/uploads/2013/07/15-two-ingredient-easy-chocolate-mousse-recipe-4.jpg","3":720,"4":1079},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTixzsisXR_ct7wced_BTTByvghActd5JzbabwBT6WETpC3wIrF","3":133,"4":200},"3":{"1":"Oh, The Things We'll Make!","2":"https://thethingswellmake.com/how-to-make-chocolate-mousse-two-types/","3":"Two Ingredient, Easy Chocolate Mousse Recipe","4":"This two ingredient, easy chocolate mousse can be whipped up in a matter of minutes","10":"FdBXMwoEnGACQJ"},"5":{"1":"flsvDnvpdIFUYxE"},"7":{"1":{"9":{"1":3.75,"2":8,"3":"Two Ingredient, Easy Chocolate Mousse Recipe","4":["4 eggs","100 g chocolate"],"5":"This two ingredient, easy chocolate mousse can be whipped up in a matter of minutes, and it's rich, ...","6":"25 min","7":"8 small servings"}}}},{"1":{"1":"https://cdn.thisiswhyimbroke.com/images/radioactive-uranium-ore-640x533.jpg","3":640,"4":533},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRlVDrWUi1LscguCB1Yj3yyVI_a1njoRRYb3IJ1DV7gP5cvS68Uow","3":200,"4":166},"3":{"1":"ThisIsWhyImBroke","2":"https://www.thisiswhyimbroke.com/radioactive-uranium-ore/","3":"Radioactive Uranium Ore","4":"","10":"tgCkyEelnhAMUx"},"5":{"1":"CGYCQOxeAVvJDdU"}},{"1":{"1":"https://i.ytimg.com/vi/3_7645Ep4Dg/maxresdefault.jpg","3":1920,"4":1080},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQA9FM_kk9sVeBrK649YPlhvBwnK-Tn5IHXrzJi_pUYsRQBqPpWpQ","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=3_7645Ep4Dg","3":"Radioactive Uranium ore, Rum jungle Northern Territory ...","4":"Radioactive Uranium ore, Rum jungle Northern Territory, Australia","10":"FuqIblHgNhtGnh"},"5":{"1":"hUMaBUtsTrmInKc"},"7":{"1":{"11":{"1":"Radioactive Uranium ore, Rum jungle Northern Territory, Australia","2":"Uranium ore specimen from Rum jungle country, Northern Territory. Tested with a 3007a Dosimeter and Labgear fast Dekatron counter.","3":"2:42","4":"1374","5":"1420416000000","6":"rustymotor","7":"14","8":"7"}}}},{"1":{"1":"https://cdn.thisiswhyimbroke.com/images/fluorescent-uranium-ore-640x533.jpg","3":640,"4":533},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKbqgNyMbbiki1a-c1dPOKvdBhH_M1GlbLZHjSAZcQKSgm3ALT","3":200,"4":166},"3":{"1":"ThisIsWhyImBroke","2":"https://www.thisiswhyimbroke.com/fluorescent-uranium-ore/","3":"Fluorescent Uranium Ore","4":"","10":"vDobLHxiyuxUJm"},"5":{"1":"ilUYbeQvEMSaiGq"}},{"1":{"1":"http://www.ansnuclearcafe.org/wp-content/uploads/2012/05/uranium-ore.png","3":374,"4":226},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRmU9YwfbSb3HA5fb6wEDVwLL4g7tFlg4kXkoSVmItr16PIDn45","3":200,"4":120},"3":{"1":"ANS Nuclear Cafe","2":"http://ansnuclearcafe.org/2012/05/19/105th-carnival-of-nuclear-energy-bloggers/uranium-ore-2/","3":"uranium ore | ANS Nuclear Cafe","4":"Uranium ore","10":"ucBMicCUggRoEY"},"5":{"1":"BdFrkpRGSIkHXya"}},{"1":{"1":"http://uraha.de/de/wp-content/uploads/2016/02/Uran_1_1_uraniumcircit.jpg","3":484,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTYXbv-9XOvU7Be3K5-4KcMJbb_jWX88YgECOeR6kgbY1XUo1AlWA","3":200,"4":144},"3":{"1":"URAHA Foundation Germany eV","2":"http://uraha.de/de/?p=409&lang=en","3":"Uranium ore deposits – URAHA Foundation Germany e.V.","4":"Uraniumcircit (Photo: Lang)","10":"BSJPqVSgvBEbrQ"},"5":{"1":"MVxLPqbHMubLNSr"}},{"1":{"1":"https://cdn.thisiswhyimbroke.com/images/uranium-ore1-640x533.jpg","3":640,"4":533},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR1sJSAdreV-tpcQGvCDqxuJTzh9XYNRbqXtQsIyC-l4aBfyKHC","3":200,"4":166},"3":{"1":"ThisIsWhyImBroke","2":"https://www.thisiswhyimbroke.com/fluorescent-uranium-ore/","3":"Fluorescent Uranium Ore","4":"","10":"dqJIUarueXyCWj"},"5":{"1":"WVggkadJTcMCXgn"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Torbernite_-_Cuneo%2C_Italia_01.jpg/220px-Torbernite_-_Cuneo%2C_Italia_01.jpg","3":220,"4":165},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTTgxEh0wD7ohE1CVBSCVwbHqFrCuGXpZYfaVNWaS_C6su6PoxEFA","3":200,"4":150},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_ore","3":"Uranium ore - Wikipedia","4":"Torbernite, an important secondary uranium mineral","10":"iWOIIHWFYNlcfq"},"5":{"1":"vYhTmBdaSUrGAkL"}},{"1":{"1":"http://unitednuclear.com/images/oregenerica.jpg","3":500,"4":424},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRfr9T5f37v30ppVmlZD8YQozfb5WBC1GA5gHlrCkNxi24GgBlA","3":200,"4":169},"3":{"1":"United Nuclear","2":"http://unitednuclear.com/index.php?main_page=product_info&products_id=460","3":"Generic Uranium Ore, range 'A ' 1,000 to 3,000 CPM : United ...","4":"Generic Uranium Ore, range 'A ' 1,000 to 3,000 CPM","10":"AqIrNMrWQlnvWt"},"5":{"1":"VqdNlIqLFBgvaJP"}},{"1":{"1":"https://cna.ca/wp-content/uploads/2014/06/Uranium-ore-2.jpg","3":1444,"4":916},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSoGKwXryzTIu5CLl-0KJgiJ-mJRBPTKNOJ_C6h12QuDPrATgOjQ","3":200,"4":126},"3":{"1":"Canadian Nuclear Association","2":"https://cna.ca/technology/energy/uranium-mining/","3":"Uranium mining - Canadian Nuclear Association","4":"Uranium ore","10":"IxNjLhyxSUqpUD"},"5":{"1":"mGuODpmVFesTMfq"}},{"1":{"1":"https://i.pinimg.com/originals/da/e7/31/dae731639771cc01af9baf342af42e5b.jpg","3":400,"4":315},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJXZB6Uoa72FIyOu687kMmo8CBlk32eFN1ywlmN03VJrTrqtl10Q","3":200,"4":157},"3":{"1":"Pinterest","2":"https://www.pinterest.com/pin/397935317044389548/","3":"Uranium ore! | christmas list | Pinterest | Mushroom fungi","4":"Uranium ore!","10":"YClYGRtfYuKJak"},"5":{"1":"dSyPSaEeHVWDqfI"}},{"1":{"1":"http://www.sott.net/image/s13/269853/full/Uraniumore.jpg","3":640,"4":409},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSGNSiJrU5IjB9SD-lavkngAd7vYEVpFm7umnqTqQPkObwJ-2C0","3":200,"4":127},"3":{"1":"Sott","2":"https://www.sott.net/article/302699-Truck-carrying-uranium-ore-catches-fire-near-Illinois-nuclear-plant","3":"Truck carrying uranium ore catches fire near Illinois nuclear ...","4":"uranium ore","10":"WlVtKUAhLJNfhk"},"5":{"1":"QOEQBiRDmPrVWBF"}},{"1":{"1":"http://unitednuclear.com/images/oregenericc.jpg","3":500,"4":374},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQreIUjsDelu90Hrb-2tdtoxvNQoBd3xdADZ1b_ybbmFX547dTX","3":200,"4":149},"3":{"1":"United Nuclear","2":"http://unitednuclear.com/index.php?main_page=product_info&products_id=462","3":"Generic Uranium Ore, range 'C' 5,500 to 7,000 CPM : United ...","4":"Generic Uranium Ore, range 'C' 5,500 to 7,000 CPM","10":"njnvvBUVetEuQS"},"5":{"1":"bDBBAxsHfTAYina"}},{"1":{"1":"https://www.sciencelearn.org.nz/system/images/images/000/001/928/full/A-lump-of-uranium-ore20160913-2996-18tz440.jpg?1522304554","3":350,"4":233},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQxCEaTAsqIuSl67rkGv4MI8Ju45c73JGkOHJbQXTt-3AncL-JrVg","3":200,"4":133},"3":{"1":"Science Learning Hub","2":"https://www.sciencelearn.org.nz/images/1928-a-lump-of-uranium-ore","3":"A lump of uranium ore — Science Learning Hub","4":"A lump of uranium ore","10":"EiNQYOwJthGmeV"},"5":{"1":"bELJSUXdwPDGErp"}},{"1":{"1":"https://www.atomicheritage.org/sites/default/files/Shinkolobwe%20Uranophane.jpg","3":600,"4":542},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQnRaRstptBcxVfjvPstHfsAlobXzGAgOWHmKRy85UYnRw7h1CDzw","3":200,"4":180},"3":{"1":"Atomic Heritage Foundation","2":"http://www.atomicheritage.org/history/combined-development-trust","3":"Combined Development Trust | Atomic Heritage Foundation","4":"... was an effort spearheaded by General Leslie Groves to control the world market of uranium ore.","10":"GXposUWyOYUjOA"},"5":{"1":"MLrJwcEqglWkjHP"}},{"1":{"1":"https://www.researchgate.net/profile/Harald_Dill/publication/225633139/figure/fig1/AS:302565414719493@1449148624739/Yellow-uranium-ore-minerals-a-Aggregates-of-slender-prisms-of-brown-b-uranophane.png","3":733,"4":547},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSEKjfsWqMGl4hFqfGy-lzXKWwBoYh6wOaNO3N0cRNBgr6QZUe4","3":200,"4":149},"3":{"1":"ResearchGate","2":"https://www.researchgate.net/figure/Yellow-uranium-ore-minerals-a-Aggregates-of-slender-prisms-of-brown-b-uranophane_fig1_225633139","3":"Fig. 5 Yellow uranium ore minerals. a Aggregates of slender ...","4":"5 Yellow uranium ore minerals. a Aggregates of slender prisms of brown β -uranophane.","10":"rmDEmetocgXAKg"},"5":{"1":"dvPqyYaaipTTMAV"}},{"1":{"1":"https://images-na.ssl-images-amazon.com/images/I/51LrKbS8ajL._SX342_.jpg","3":342,"4":323},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR3RP2p3i33znUvJ6fbjNFc9-qYwYGO1tu1wu0CSeqQVabLJG6ZiA","3":200,"4":188},"3":{"1":"Amazon.com","2":"https://www.amazon.com/Images-SI-Uranium-Ore/dp/B000796XXM","3":"Amazon.com: Uranium Ore: Industrial & Scientific","4":"Uranium Ore","10":"bhYHaPCiSXkTvX"},"5":{"1":"onKaEPQLbBfVatM"},"7":{"1":{"10":{"1":3.5,"2":1293,"3":"Uranium Ore","4":"Images SI","5":"Radioactive sample of uranium ore. The ore sample material is Naturally Occurring Radioactive Materials (NORM). Counts Per Minute (CPM) activity rate ...","6":true,"7":39.95000076293945,"8":"USD"}}}},{"1":{"1":"https://c8.alamy.com/comp/BKJ16C/uranium-ore-rocks-west-cornwall-BKJ16C.jpg","3":1300,"4":956},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRYlZK2UaapmUqrLpDu70rVzqTT6NA61fAeyCo317iFFtPshmHW","3":200,"4":146},"3":{"1":"Alamy","2":"https://www.alamy.com/stock-photo-uranium-ore-rocks-west-cornwall-29284932.html","3":"Uranium ore; rocks; west Cornwall Stock Photo: 29284932 - Alamy","4":"Uranium ore; rocks; west Cornwall","10":"lJAXaGnSHpRfoU"},"5":{"1":"JBRendfBGTuTvxW"}},{"1":{"1":"https://i.ytimg.com/vi/DBXrr7N9kKs/maxresdefault.jpg","3":1304,"4":1032},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQBXs9nco7zuFLKLk-tNGc9ZuMLjsra9buptZfLoNGXNW113UEW","3":200,"4":158},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=DBXrr7N9kKs","3":"HOW IT WORKS: Uranium Deposits - YouTube","4":"","10":"iBejAnpsixRNpa"},"5":{"1":"EIPCUcvIBEVlmhd"},"7":{"1":{"11":{"1":"HOW IT WORKS: Uranium Deposits","2":"The formation of uranium deposits in the earth is explained and where to find them.","3":"24:01","4":"145842","5":"1404864000000","6":"DOCUMENTARY TUBE","7":"337","8":"96"}}}},{"1":{"1":"https://antinuclearinfo.files.wordpress.com/2013/05/uranium-ore.gif?w=300&h=229","3":300,"4":229},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ8T_qLbyYQkzuowvWo8HBjwL-HAwWXhc6Lloi8ubq7NxSAJPn9","3":200,"4":152},"3":{"1":"Nuclear-News.net","2":"https://nuclear-news.net/2015/07/10/investigation-at-last-into-radioactive-pollution-of-johannesburg-from-uranium-mining/","3":"Investigation at last into radioactive pollution of ...","4":"Investigation at last into radioactive pollution of Johannesburg, from uranium mining","10":"HnrxEBILvQkpOy"},"5":{"1":"nRucRoeKfJXqFxP"}},{"1":{"1":"http://www.cca.org/blog/images/uranium-ore.jpg","3":1000,"4":665},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS_uexaGHzyyA8K0Qm2td_dIcrgvTmcOFPyLDcphsR4gpJoxeI-","3":200,"4":133},"3":{"1":"Dave Fischer Weblog","2":"http://www.cca.org/blog/20120305-Uranium-Ore.shtml","3":"Dave Fischer Weblog","4":"Uranium Ore.","10":"RkChWglXYuHiCm"},"5":{"1":"LforPPQgUJdQwtW"}},{"1":{"1":"https://www.miningafrica.net/wp-content/uploads/2016/08/Gummite-Uraninite-Zircon-62299.jpg","3":600,"4":493},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR8Em1d_798dXwXjgbatsQuQ56eeOmcKHmXeCu1cDObKXlJgwIqWA","3":200,"4":163},"3":{"1":"Mining Africa","2":"https://www.miningafrica.net/natural-resources-africa/mining-uranium-in-africa/","3":"Mining Uranium in Africa","4":"It only became known that Uranium is radioactive in the 1890s. The French physicist Antoine Henri ...","10":"BEtTejSuTPBcBv"},"5":{"1":"fwMhNLexWVpLyHL"}},{"1":{"1":"http://uraha.de/de/wp-content/uploads/2016/02/Uran_1_1_torbernite.jpg","3":476,"4":331},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS079SrqlTpBo1n1dmw30F4aV154GvSSPPjm0f4lx2-ODMaw_lQ","3":199,"4":139},"3":{"1":"URAHA Foundation Germany eV","2":"http://uraha.de/de/?p=409&lang=en","3":"Uranium ore deposits – URAHA Foundation Germany e.V.","4":"Torbernite, an important secondary uranium mineral (Photo: Aangelo)","10":"QKcgvUhHbwCTrJ"},"5":{"1":"oxDhPBfwnEUdPAq"}},{"1":{"1":"http://unitednuclear.com/images/oregenericb.jpg","3":500,"4":412},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRouW9zQOLSAsQ7gTV6GskfzJRe0YE3xwtSmHRrNdORK7pSUNVi","3":200,"4":165},"3":{"1":"United Nuclear","2":"http://unitednuclear.com/index.php?main_page=product_info&products_id=461","3":"Generic Uranium Ore, range 'B' 3,500 to 5,000 CPM : United ...","4":"Generic Uranium Ore, range 'B' 3,500 to 5,000 CPM","10":"wngjWxwrNFdpfY"},"5":{"1":"suepfIIYjVLClCr"}},{"1":{"1":"http://nevada-outback-gems.com/mineral_information/carnotite02.jpg","3":481,"4":385},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRLm3Pc7sHZ97mDx8dVQeW0IO-_R5J75qt5ddm2zgQrTpaRox9r6w","3":200,"4":160},"3":{"1":"Nevada Outback Gems","2":"http://nevada-outback-gems.com/Base_ores/Vanadium_ore.htm","3":"Photos of Natural Vanadium Ore, Vanadium minerals and specimens","4":"","10":"hJwcXLvYUKeohc"},"5":{"1":"fXvuWbanhBKavSa"}},{"1":{"1":"https://image.slidesharecdn.com/topic5-uraniumoredeposits-151123233751-lva1-app6891/95/uranium-ore-deposits-1-638.jpg?cb=1515416471","3":638,"4":479},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRp9WyI3pu5dWpY7YwW-Ye9kSrE3ekVEytb6SAXpjwHhbX1ODrKFw","3":200,"4":149},"3":{"1":"SlideShare","2":"https://www.slideshare.net/hzharraz/uranium-ore-deposits","3":"Uranium Ore Deposits","4":"Topic 5: Uranium Ore Deposits Hassan Z. Harraz hharraz2006@yahoo.com 2012 ...","10":"sRmdBVvmonxEpy"},"5":{"1":"rIlPJsVLKNgkDAX"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Pitchblende_schlema-alberoda.JPG/220px-Pitchblende_schlema-alberoda.JPG","3":220,"4":164},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS7EEEtGcfbvzMoNY8dn5zY5aO6HmrB12mbY8LuQI8Kd_VmgmTfMg","3":200,"4":149},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_ore","3":"Uranium ore - Wikipedia","4":"Uranium minerals[edit]","10":"RSiPQByYGTChQJ"},"5":{"1":"BLCmBsMpofnWKno"}},{"1":{"1":"http://www.ioffer.com/img/item/643/193/629/uraninite-pitchblende-uranium-ore-410-309e.jpg","3":580,"4":326},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcScBLPgjcic6PoDFMVuNxcGz6fXcJfTYTnoia2NbqeLz2l-fUcfgQ","3":200,"4":112},"3":{"1":"iOffer","2":"http://www.ioffer.com/i/uraninite-pitchblende-uranium-ore-410-643193629","3":"URANINITE PITCHBLENDE URANIUM ORE 410 for sale","4":"URANINITE PITCHBLENDE URANIUM ORE 410. «","10":"fCAEhnojVGLbXe"},"5":{"1":"UopSkuqGDGHgqYI"},"7":{"1":{"10":{"1":5.0,"3":"URANINITE PITCHBLENDE URANIUM ORE 410","5":"botryoidal uraninite , from Shaft 4 /Pribram , Czech Rep. , 410 µsv/h with SBM-20@ 1cm , in 6x4cm box, paypal or skrill only, , Shipping Included!!!! ...","6":false,"7":69.0,"8":"USD"}}}},{"1":{"1":"https://wiki.factorio.com/images/Electric_mining_drill-Uranium_ore.png","3":300,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQFhukFSWQx7eHxhvZcQdOUT7H5iozgUhW1LXULfNXMNy_0TSpINw","3":200,"4":200},"3":{"1":"Official Factorio Wiki - Factorio","2":"https://wiki.factorio.com/Uranium_ore","3":"Uranium ore - Factorio Wiki","4":"Electric mining drill placed on uranium ore, pipe input/output visible.","10":"rpsNWfGUeFhSFH"},"5":{"1":"xSbqhsPwkeNJJwj"}},{"1":{"1":"https://d32ogoqmya1dw8.cloudfront.net/images/research_education/nativelands/Navajo_mine.jpg","3":1536,"4":1024},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTrK3Fn7KNQLi-7ex_egj4jahjSGX8MDMSr9jV6fJk8qnKWiRO7","3":200,"4":133},"3":{"1":"SERC - Carleton","2":"https://serc.carleton.edu/research_education/nativelands/navajo/uraniumdeposits.html","3":"Uranium Deposits","4":"","10":"OPpSedewOjOjFm"},"5":{"1":"IwasypKdPbbkdbm"}},{"1":{"1":"https://vignette.wikia.nocookie.net/feed-the-beast/images/3/3f/Uranium_Ore_Block.png/revision/latest?cb=20130214161003","3":256,"4":256},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ0h1LlRX57eB5Seh1DZ7kRPEZBjmdO6Oi2L2vET1ZuAi2LTsyV","3":200,"4":200},"3":{"1":"Feed The Beast Wiki - Fandom","2":"http://feed-the-beast.wikia.com/wiki/Uranium_Ore_(Block)","3":"Uranium Ore (Block) | Feed The Beast Wiki | FANDOM powered by ...","4":"Uranium Ore","10":"cjtOgJKjdrbTlM"},"5":{"1":"FHxEnUGGXWIXGvM"}},{"1":{"1":"http://www.abc.net.au/news/image/189970-3x2-940x627.jpg","3":940,"4":627},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR26n4Kg9hDPNpZZfP9sKNtDgObRqfssUpAuqj2V-48xc0HJhK0KQ","3":200,"4":133},"3":{"1":"ABC","2":"http://www.abc.net.au/news/2017-07-18/a-haul-truck-carries-uranium-ore/8718504","3":"A haul truck carries uranium ore - ABC News (Australian ...","4":"A haul truck carries uranium ore","10":"mxShrEfddOaeoO"},"5":{"1":"RBmTMcuVHqUjext"}},{"1":{"1":"https://carlwillis.files.wordpress.com/2008/05/lv_forsale.jpg","3":1000,"4":608},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT-6KvJESWkqhrOnLp92rsyDglAWSo25nQ6XgS7Pz8vLbYangT07w","3":200,"4":121},"3":{"1":"Special Nuclear Material - WordPress.com","2":"https://carlwillis.wordpress.com/2008/05/05/for-sale-uranium-ore/","3":"For Sale: Uranium Ore | Special Nuclear Material","4":"","10":"emOhCdmtvWuqxy"},"5":{"1":"KaHBJwWvAnWHxWU"}},{"1":{"1":"https://3c1703fe8d.site.internapcdn.net/newman/gfx/news/hires/2015/1-scientistsse.jpg","3":3654,"4":1998},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSPtwII-3qnD47udpLTwGERykilZ63nZpdyFngPEX_NSu8XB2ONZQ","3":200,"4":109},"3":{"1":"Phys.org","2":"https://phys.org/news/2015-01-scientists-ways-uranium-ore-legacy.html","3":"Scientists search for new ways to deal with US uranium ore ...","4":"Scientists search for new ways to deal with US uranium ore processing legacy","10":"fxhnuqMXKASHgD"},"5":{"1":"NXKnOHjeFeBlMhU"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Pitchblende371.JPG/220px-Pitchblende371.JPG","3":220,"4":165},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR55Fad8E_lL6V6bCKaBdTczoSYdZVbCDBHajNr0O65HLmBr5GV","3":200,"4":150},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_ore","3":"Uranium ore - Wikipedia","4":"Uranium ore (pitchblende in dolomite) from the vein-type deposit Niederschlema-Alberoda","10":"DRckVycLowVDNu"},"5":{"1":"VDlQeLSNRXHBbsC"}},{"1":{"1":"http://www.republicoflakotah.com/wp-content/uploads/2010/03/ISL-Diagram2.gif","3":420,"4":293},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQxBQbzOxWVYByDlrNOJS2meHl-effFoxlYbokZmSyCQlqKINUXLw","3":199,"4":139},"3":{"1":"TU Freiberg","2":"https://tu-freiberg.de/umh-vii-2014","3":"Uranium Mining and Hydrogeology 2014 International Conference ...","4":"Session I: Uranium mining","10":"PQiLQrvMaQoOHn"},"5":{"1":"YUuAOodADCEBjAi"}},{"1":{"1":"https://images-na.ssl-images-amazon.com/images/I/51sOTDswZ0L._SX425_.jpg","3":425,"4":319},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSi0-trSU79rMckw3x4ZOwC1lQpTQNTqnyrRrDeKd8-3CL4VlYZzQ","3":200,"4":149},"3":{"1":"Amazon.com","2":"https://www.amazon.com/uranium-unrefined-uraninite-radiation-detector/dp/B00CQ9LLR4","3":"Rare earth uranium oxide, high grade unrefined uranium ore ...","4":"Rare earth uranium oxide, high grade unrefined uranium ore uraninite, for Geiger counter &","10":"fpeVKHGKMYkVvG"},"5":{"1":"hMJKYgbarWYolsf"},"7":{"1":{"10":{"1":4.0,"2":69,"3":"Rare earth uranium oxide, high grade unrefined uranium ore uraninite, for Geiger counter & radiation detector test source!","4":"LifeTech","5":"The rare earth uranium oxide, naturally high grade uranium ore contains high concentration of uraninite which can be used to test your Geiger counter, ...","6":true,"7":79.9000015258789,"8":"USD"}}}},{"1":{"1":"https://thumbs.dreamstime.com/b/uranium-ore-7968842.jpg","3":800,"4":642},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRfDCPo3aFV1FsQ-Co0GUw8rjQwkrlKTnVsmmbSqJLKC-OuYzMfKw","3":200,"4":160},"3":{"1":"Dreamstime.com","2":"https://www.dreamstime.com/stock-photography-uranium-ore-image7968842","3":"Uranium ore stock photo. Image of rock, industry, activity ...","4":"Uranium ore - isolated object on white background","10":"lFgPMffOrsdglO"},"5":{"1":"GAGCRvPsInlrCVp"}},{"1":{"1":"https://www.dnddice.com/media/catalog/product/cache/1/image/650x/613132e0f270af58849e99a6dbb00be2/m/a/marbled_nick_yellow.jpg","3":650,"4":655},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTWFIWTzKbGt_-X5vW437tZv8qB2KM0WIPIonWHMox4yfraI85s","3":199,"4":200},"3":{"1":"DnD Dice","2":"https://www.dnddice.com/sets-of-dice/uranium-ore-dice-set-opaque.html","3":"Uranium Ore Dice Set (Marbled) - Sets of Dice","4":"Uranium Ore Dice Set (Marbled)","10":"lDtobcULsHuDEs"},"5":{"1":"CUfvqkkkYhexTmG"}},{"1":{"1":"https://i.ebayimg.com/images/g/ZUAAAOSw8jVapWYd/s-l300.jpg","3":300,"4":281},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSLL-gQGDHliqAAkwizhTCbydcVOftQGPQw3rRqIgN7635H4oSc","3":200,"4":187},"3":{"1":"eBay","2":"https://www.ebay.com/itm/URANIUM-ORE-ELEMENT-92-COLLECTORS-SAMPLE-IN-JAR-5-0-to-6-0-GM-/153034952406","3":"URANIUM ORE, ELEMENT #92, COLLECTOR'S SAMPLE IN JAR, 5.0 to ...","4":"Image is loading URANIUM-ORE-ELEMENT-92-COLLECTOR-039-S-SAMPLE-","10":"mNpopJVFxQrnya"},"5":{"1":"iVvPpnldBUCGNXi"},"7":{"1":{"10":{"3":"Details about URANIUM ORE, ELEMENT #92, COLLECTOR'S SAMPLE IN JAR, 5.0 to 6.0 GM +","5":"URANIUM ORE, ELEMENT #92, COLLECTOR'S SAMPLE IN JAR, 5.0 to 6.0 GM + | Collectibles, Rocks, Fossils & Minerals, Crystals & Mineral Specimens | eBay!","7":6.5,"8":"USD"}}}},{"1":{"1":"https://blogs.sap.com/wp-content/uploads/2013/08/uranium_ore_256462.jpg","3":274,"4":184},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT-B4iVhhSn-aSVkwhaNBxj-EVvYpXqAot_xaFQl8zFaqpdtvwENA","3":200,"4":134},"3":{"1":"SAP Blogs","2":"https://blogs.sap.com/2013/08/03/uranium-mining/","3":"Uranium Mining | SAP Blogs","4":"About Uranium Uranium Ore.jpg","10":"FMUDYvtjGcwkkY"},"5":{"1":"tKaSxPOctyupeuH"}},{"1":{"1":"https://greentumble.com/wp-content/uploads/2016/11/Environmental-impacts-of-uranium-mining.jpg","3":800,"4":500},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTaNnLOEdRMnLDqAb99SNc7wfxtk58huSsUi4vinIsNrf7-PHw4gg","3":200,"4":124},"3":{"1":"Greentumble","2":"https://greentumble.com/environmental-impacts-of-uranium-mining/","3":"Environmental Impacts of Uranium Mining | Greentumble","4":"Environmental impacts of uranium mining","10":"mrFxmtNXvpHlNt"},"5":{"1":"KuerxbEKttWuPLV"}},{"1":{"1":"https://c1.staticflickr.com/3/2566/4058064866_ce4a2b2c53_b.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvky2ZpyEH6n11HPYAXDRzG6dV1ljdU5jr9CL6vJSF_T_6kwa02g","3":200,"4":149},"3":{"1":"Flickr","2":"https://www.flickr.com/photos/bionerd/4058064866/in/pool-10372360@N00/","3":"pitchblende uranium ore blisters | very beautiful, big black ...","4":"... pitchblende uranium ore blisters | by bionerd23 ☢","10":"VTmkPJKhTRRdsW"},"5":{"1":"KTPrWoVlIutiblb"}},{"1":{"1":"http://energyeducation.ca/wiki/images/thumb/8/82/Openpit.jpg/300px-Openpit.jpg","3":300,"4":200},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQv2IpxKcOVjZRoPvYLl2RPSCYdJYo23xr4QQvY2HKf7VT7HoRj","3":200,"4":133},"3":{"1":"Energy Education","2":"http://energyeducation.ca/encyclopedia/Uranium_mining","3":"Uranium mining - Energy Education","4":"Uranium mining","10":"PSSeQtHLcKjsyy"},"5":{"1":"pdbvTOCwHmiiCNm"}},{"1":{"1":"https://www.wnti.co.uk/media/3990/1.jpeg","3":750,"4":562},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQiA78QEyJ33i6F2Yj3KXy_JaaEnAAcAXcB42oNpYA1CYwlQ3E6","3":200,"4":149},"3":{"1":"World Nuclear Transport Institute","2":"https://www.wnti.co.uk/media-centre/nuclear-fuel-cycle/uranium-mining-and-refining.aspx","3":"Uranium Mining and Refining | World Nuclear Transport Institute","4":"Uranium Ore Concentrate, Courtesy of the Nuclear Decommissioning Authority 3","10":"IWjAlvHXuPBbmR"},"5":{"1":"XAxhsMHqiMGnxOO"}},{"1":{"1":"https://geoinfo.nmt.edu/resources/uranium/images/upitmine.jpg","3":363,"4":236},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR4H1t_VZ9t1VuHddmc7crKQypetQIwqrCigzUVmE1HzZHvxAYZ","3":200,"4":129},"3":{"1":"New Mexico Bureau of Geology & Mineral Resources","2":"https://geoinfo.nmt.edu/resources/uranium/mining.html","3":"Uranium: How is it Mined?","4":"Rabbit Lake Mine","10":"jiWduexAsVAXgW"},"5":{"1":"CLeQJcVQBoFIagE"}},{"1":{"1":"https://wiki.factorio.com/images/thumb/Glow.png/300px-Glow.png","3":300,"4":288},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT1MSj1u7c97J9C2EtjqGIWe2EKHJ8rJ5EdAw6SQ4fxe4FjgMyNtQ","3":200,"4":192},"3":{"1":"Official Factorio Wiki - Factorio","2":"https://wiki.factorio.com/Uranium_ore","3":"Uranium ore - Factorio Wiki","4":"Uranium ore","10":"PcQGCwoVlQSrIY"},"5":{"1":"FPqpErYdeYDiUGO"}},{"1":{"1":"https://ground-force-training.s3.amazonaws.com/upload/user/image/M&M-Commodities-Uranium20170924192443101.jpg","3":920,"4":520},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPz1yX-sSLLaN3o0YdR68gr_YkcMccvWjMoumhmTL04h9zTjND","3":200,"4":113},"3":{"1":"Ausenco","2":"http://www.ausenco.com/en/commodity-uranium","3":"Uranium Ore Mining, Processing, Production; Ausenco","4":"Uranium","10":"hlctXrnNGrVTPx"},"5":{"1":"ARHLSTwSQUCvDVa"}},{"1":{"1":"https://d32ogoqmya1dw8.cloudfront.net/images/research_education/nativelands/UraniumDeposits.jpg","3":1069,"4":696},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTqi77ywwiUP56AbW7lpI-ephJN9JpUDZRwLXjeeFtcr0DMKFkA","3":200,"4":130},"3":{"1":"SERC - Carleton","2":"https://serc.carleton.edu/research_education/nativelands/navajo/uraniumdeposits.html","3":"UraniumDeposits.jpg","4":"Uranium Deposits on the Navajo Nation","10":"RqykeJkdrEJoox"},"5":{"1":"qyToUXsGyIkStsP"}},{"1":{"1":"https://i.ytimg.com/vi/bCYiBXolKLg/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRr6MOvrW_Z_bzPWGrYowSudjGz8BBDA48LVqROH57ksR6dQBef","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=bCYiBXolKLg","3":"Uraninite hunting - finding Uranium ore at shaft 4 - YouTube","4":"","10":"DfjhwMoDvFmhjw"},"5":{"1":"xSLsTRSSAwJXOeU"},"7":{"1":{"11":{"1":"Uraninite hunting - finding Uranium ore at shaft 4","2":"this is at the shaft #4 dump near Pribram /Czech Rep., Tube is SI-15BG, Geiger counter is Mygeiger V2.0 with SBM-20 from rhelectronics.net *new video*: https...","3":"10:24","4":"7888","5":"1431648000000","6":"weirdmeister inc.","7":"86","8":"17"}}}},{"1":{"1":"http://www.mining.com/wp-content/uploads/2016/09/namibias-new-uranium-mine-to-triple-countrys-output-by-2017.jpg","3":900,"4":505},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRFG-Dff9s5BHT2F1F6K6UjYae_OLK-y2vLBIDOSmIJit7IAWnOYg","3":200,"4":112},"3":{"1":"MINING.com","2":"http://www.mining.com/namibias-new-uranium-mine-triple-countrys-output-2017/","3":"Namibia's new uranium mine to triple country's output by 2017 ...","4":"Namibia's new uranium mine to triple country's output by 2017","10":"jxnEOGqQAmQeID"},"5":{"1":"IOpOLAIRwJAWxKU"}},{"1":{"1":"https://www3.epa.gov/radtown/images/uranium-ore-small.jpg","3":209,"4":188},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTg_rtmpXq9c9BUYEXHb9Y7V0kw6B_xV0735UXESJhESvyiYHO5","3":200,"4":179},"3":{"1":"EPA","2":"https://www3.epa.gov/radtown/uranium-mines-mills.html","3":"Uranium Mines and Mills | RadTown USA | US EPA","4":"Uranium ore.","10":"EnbXhrObjPNjlK"},"5":{"1":"MlWPlauEsaDgTqc"}},{"1":{"1":"http://www.walletwrecker.com/wp-content/uploads/2017/02/uranium-ore-paperweight.jpg","3":780,"4":690},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDwWe9IuEuH7JtF6l36LPGt84oX1M30KMIR3Rtb3XW-JMd0b4L","3":200,"4":176},"3":{"1":"Cool Stuff","2":"http://www.walletwrecker.com/uranium-ore-paperweight/","3":"Uranium Ore Paperweight - WalletWrecker","4":"Uranium Ore Paperweight","10":"VTykOlfiIMxIEj"},"5":{"1":"ChvBQDrmkJAWaoA"}},{"1":{"1":"https://bloximages.chicago2.vip.townnews.com/azdailysun.com/content/tncms/assets/v3/editorial/8/ae/8aedbad9-4c22-51f9-a5a4-c3ea8515d944/59e2c68821afb.image.jpg","3":228,"4":341},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRnVE4UYV0Qs53XdLGrePAjB6TbFkXI_d2AgiaZ-I7AW70d2U7O","3":133,"4":200},"3":{"1":"Arizona Daily Sun","2":"http://azdailysun.com/news/local/new-uranium-mines-no-simple-answers/article_20522e2c-98ed-58c4-a6cf-93ee27da9aa2.html","3":"New uranium mines: no simple answers | Local | azdailysun.com","4":"Pinenut Mine underground","10":"qkNfYeDKPPEKYU"},"5":{"1":"IutbavLAJOjFHen"}},{"1":{"1":"https://c8.alamy.com/comp/M14C80/fort-davis-texas-uranium-ore-in-the-chihuahuan-desert-mining-heritage-M14C80.jpg","3":1300,"4":956},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcST-CQ0gKpU0YteBEcSBmB8Ev-LBuw-HuMgXJXxD80hNJ-HlGLFHw","3":200,"4":146},"3":{"1":"Alamy","2":"https://www.alamy.com/stock-photo-fort-davis-texas-uranium-ore-in-the-chihuahuan-desert-mining-heritage-172815776.html","3":"Fort Davis, Texas - Uranium ore in the Chihuahuan Desert ...","4":"Fort Davis, Texas - Uranium ore in the Chihuahuan Desert Mining Heritage Exhibit at the Chihuahuan ...","10":"UBxpddAFAwRjgw"},"5":{"1":"AGIGVWDfGiJCbtH"}},{"1":{"1":"https://image.slidesharecdn.com/uraniumoredepositsinegypt-161030181530/95/uranium-ore-deposits-in-egypt-5-638.jpg?cb=1515416002","3":638,"4":479},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTnp6u3T7uXrv_Yibxe3DR1agjgkXYg_EGhM1yPJ8ZIV0MI-8zS","3":200,"4":149},"3":{"1":"SlideShare","2":"https://www.slideshare.net/hzharraz/uranium-ore-deposits-in-egypt","3":"URANIUM ORE DEPOSITS IN EGYPT","4":"","10":"WEgTtqKJfVTjNc"},"5":{"1":"LenKYmayTuHJGvq"}},{"1":{"1":"https://vignette.wikia.nocookie.net/starboundgame/images/f/f3/Uranium-0.png/revision/latest?cb=20150430191627","3":278,"4":274},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTRd0RMVJF-9eJ2p2QKYGwneLGVCf7koVrhrdMP3F0fTmwynjLH","3":200,"4":197},"3":{"1":"Starbound Wiki - Fandom","2":"http://starbound.wikia.com/wiki/Uranium_Ore","3":"Uranium Ore | Starbound Wiki | FANDOM powered by Wikia","4":"Uranium-0","10":"NAUrpgvWASmJnt"},"5":{"1":"JWELSnTbteHvAJV"}},{"1":{"1":"https://file.ejatlas.org/docs/Rossing-uranium-mine-near-008.jpg","3":460,"4":276},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTZgMEJmhy8irJjPAZWmgbkoURXeAImcsUXN-W-SnWU0rz5Zlxmhg","3":199,"4":119},"3":{"1":"EJAtlas","2":"https://ejatlas.org/conflict/rio-tintos-rossing-uranium-mine-namibia","3":"Rio Tinto's Rössing Uranium Mine, Namibia | EJAtlas","4":"Rio Tinto's Rössing Uranium Mine, Namibia","10":"OhVbJHbOaxpJTm"},"5":{"1":"yhFGyEGORtvxyiT"}},{"1":{"1":"https://thumbs3.ebaystatic.com/d/l225/m/mKiNHUomL_2vUOfQwaPTtAQ.jpg","3":225,"4":169},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQKRhLsXJdCdro31Ub7eNF_LhDdM1jfMcJqF35fpIOLtvUrBQiL","3":200,"4":150},"3":{"1":"eBay","2":"https://www.ebay.com/bhp/uranium-ore","3":"Uranium Ore: Crystals & Mineral Specimens | eBay","4":"RARE URANIUM Ore HAYNESITE type locale Repete Mine Blanding Utah LARGE!","10":"BmEyAvaFQTxYHs"},"5":{"1":"PRRWIHqYNnbEhku"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Uranium_production_world.PNG/300px-Uranium_production_world.PNG","3":300,"4":132},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQWPwZFkWSmelETZtm3W8ytFo3f8MAkVQGVv9xR6g2poaYN6tebDQ","3":200,"4":88},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_mining","3":"Uranium mining - Wikipedia","4":"World Uranium production in 2005.","10":"lsykkyWvdhGkhI"},"5":{"1":"DiIqNhbruIGsROR"}},{"1":{"1":"https://www.researchgate.net/profile/Tyler_Spano/publication/320569651/figure/fig1/AS:560662205210624@1510683694153/Example-of-uranium-ore-samples-and-their-associated-alteration-rinds-Great-Bear-Lake-and.png","3":850,"4":232},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQGakvvuKcktkpJwUfcIEetuPkAFoyaFJamqY9nG8KwajgWL66cTA","3":200,"4":54},"3":{"1":"ResearchGate","2":"https://www.researchgate.net/figure/Example-of-uranium-ore-samples-and-their-associated-alteration-rinds-Great-Bear-Lake-and_fig1_320569651","3":"Example of uranium ore samples and their associated ...","4":"Example of uranium ore samples and their associated alteration rinds (Great Bear Lake and Jefferson","10":"PjnvTFesdEKBRe"},"5":{"1":"VSDXIHQtDjEYvMK"}},{"1":{"1":"https://www.grandcanyontrust.org/sites/default/files/e_uranium_ore.jpg","3":600,"4":660},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRV2vkJir6j5M9GGj9Daws2_5mmfJLHHlMuYlvD-tFgFQq50LJa","3":182,"4":200},"3":{"1":"Grand Canyon Trust","2":"https://www.grandcanyontrust.org/colorado-plateau-uranium","3":"Uranium | Grand Canyon Trust","4":"Uranium - deposits","10":"tixmKKALwfPbAV"},"5":{"1":"gMjqkkdkgUNeyLy"}},{"1":{"1":"http://uranium.csis.org/wp-content/uploads/2014/09/uranium_mine.jpg","3":2318,"4":880},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSfTlqkUotU-2s86KZPoKTei68672JI0c3bTzX3Owc_I46nRApIUA","3":200,"4":75},"3":{"1":"Governing Uranium - Center for Strategic and International ...","2":"http://uranium.csis.org/production/","3":"1 - Governing Uranium","4":"01_minephoto_1of2","10":"rdtbvLcLoNbFWF"},"5":{"1":"LjeRklRSOmSTOBV"}},{"1":{"1":"https://vignette.wikia.nocookie.net/thetekkit/images/4/4e/Uranium_Ore_2.png/revision/latest?cb=20121011054332","3":1613,"4":1032},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS-2NIuZvYepV4lvhDpyZxosb6pf5BbQ3yke9xkWMnknU3MSriD","3":200,"4":127},"3":{"1":"The Tekkit Classic Wiki - Fandom","2":"http://tekkitclassic.wikia.com/wiki/File:Uranium_Ore_2.png","3":"Image - Uranium Ore 2.png | The Tekkit Classic Wiki | FANDOM ...","4":"Uranium Ore 2.png","10":"fVoMdmhrsqQnoA"},"5":{"1":"DfOlohDTbnVvKyp"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Uraninite-usa32abg.jpg/220px-Uraninite-usa32abg.jpg","3":220,"4":217},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7Z_u2G5UCMhp9M5MEZVGO39z_Ek0FiZM7ffNguWI1YK56MtGshQ","3":200,"4":197},"3":{"1":"911 Metallurgist","2":"https://www.911metallurgist.com/blog/pitchblende-uraninite-ore","3":"Pitchblende Uranium Ore","4":"... in deposits of this type. pitchblende uraninite","10":"PxpNofJwxlbdey"},"5":{"1":"vmYLxMtxKDQFWxF"}},{"1":{"1":"https://vignette.wikia.nocookie.net/technicpack/images/8/88/Uranium_Ore.png/revision/latest?cb=20121230105240","3":1366,"4":706},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQkvZjnZRf1MTyPRxcA5_fUUC7v4ZfluKLN-NPuYBZTpqB_afEB","3":200,"4":103},"3":{"1":"Technic Pack Wiki - Fandom","2":"http://technicpack.wikia.com/wiki/File:Uranium_Ore.png","3":"Image - Uranium Ore.png | Technic Pack Wiki | FANDOM powered ...","4":"Uranium Ore.png","10":"eoRoWdBXHUsICT"},"5":{"1":"RGVYNJSonUGgGTn"}},{"1":{"1":"http://media.kenanaonline.com/photos/1238066/1238066871/large_1238066871.gif?1289334469","3":287,"4":350},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTGTmdR9WCI6pYTw4vspENHpWOi7BVS-K1s4lp2uiVsJ-80XTY5uw","3":163,"4":200},"3":{"1":"بوابات كنانة أونلاين","2":"https://kenanaonline.com/users/absalman/posts/187419","3":"THE URANIUM ORE MINERALS - عبدالعاطي سالمان- مشروع العصر ...","4":"THE URANIUM ORE MINERALS","10":"mNHAuArniWXJRj"},"5":{"1":"CVNwppputpGlJil"}},{"1":{"1":"https://ae01.alicdn.com/kf/HTB1Yg6DIpXXXXalXFXXq6xXFXXXE/Phosphorus-tin-mine-uranium-ore-chalcopyrite-crystal-gem-stone-raw-ore-samples-mathematics-Tian-Yu-mineral.jpg_640x640.jpg","3":640,"4":600},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSgmUKhyf7JDiE73fHSE4_cq6M4OLT7bBWQofzuvUCRKK8-a9ws","3":200,"4":187},"3":{"1":"AliExpress.com","2":"https://www.aliexpress.com/item/Phosphorus-tin-mine-uranium-ore-chalcopyrite-crystal-gem-stone-raw-ore-samples-mathematics-Tian-Yu-mineral/32379491924.html","3":"Phosphorus tin mine uranium ore chalcopyrite crystal gem ...","4":"Phosphorus tin mine uranium ore chalcopyrite crystal gem stone raw ore samples mathematics Tian Yu ...","10":"VROMXGJiTLfNcm"},"5":{"1":"fOtJguCFMFFiTGM"},"7":{"1":{"10":{"3":"Phosphorus tin mine uranium ore chalcopyrite crystal gem stone raw ore samples mathematics Tian Yu mineral stones-in Aerators from Home Improvement on ...","6":false,"7":2719.0,"8":"USD"}}}},{"1":{"1":"https://thehightechsociety.com/wp-content/uploads/2017/12/uraniumorefacts-1000x720.jpg","3":1000,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTTzm_aIsh8drvWBOgUN-fCco8pfiWe6D9ZdCZYdZ0MeKuipCmJ","3":199,"4":143},"3":{"1":"The High Tech Society","2":"https://thehightechsociety.com/is-uranium-dangerous-facts-about-uranium-you-may-not-know/","3":"Is Uranium Dangerous - Facts About Uranium You May Not Know ...","4":"Is Uranium Dangerous – Facts About Uranium You May Not Know","10":"XGijdDsAQoSvIl"},"5":{"1":"amATHrpPAUxWKDa"}},{"1":{"1":"https://media.nature.com/m685/nature-assets/ngeo/journal/v5/n2/images/ngeo1386-f1.jpg","3":685,"4":432},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQgjRj8o_JLV2wZN-swnguCcXuW9-Zx2AKuEELmIqiUa4VuULfudg","3":200,"4":125},"3":{"1":"Nature","2":"https://www.nature.com/articles/ngeo1386","3":"Uranium-ore giants | Nature Geoscience","4":"Richard et al. show that the giant high-grade uranium ore found in the Athabasca Basin could have ...","10":"CKCkDIIYUrnDPb"},"5":{"1":"XbggxJvpqFKrTft"}},{"1":{"1":"http://www.abc.net.au/radionational/image/6593820-3x2-700x467.jpg","3":700,"4":467},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQU2lHa-Tht79z6V7T3AUOMhUz2uPtB8TRSCXcsixKWMHTPp2hX","3":200,"4":133},"3":{"1":"ABC","2":"http://www.abc.net.au/radionational/programs/rearvision/history-of-uranium-mining-in-australia/6607212","3":"The long and controversial history of uranium mining in ...","4":"Ranger uranium mine","10":"AYUiOOonsQcudS"},"5":{"1":"ysejMaDMnehJEVo"}},{"1":{"1":"http://www.ioffer.com/img/item/642/410/160/uraninite-pitchblende-uranium-ore-240-4ae7.jpg","3":580,"4":388},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS6ek08_PoH4HNHBj37nkhiLBztekkXmHHyVxxhfeXKLysCXL_lPg","3":200,"4":133},"3":{"1":"iOffer","2":"http://www.ioffer.com/i/uraninite-pitchblende-uranium-ore-240-642410160","3":"URANINITE PITCHBLENDE URANIUM ORE 240 for sale","4":"URANINITE PITCHBLENDE URANIUM ORE 240. «","10":"VsvtUbUcmgWOtd"},"5":{"1":"TaBEXnwLcVoSGRF"},"7":{"1":{"10":{"1":5.0,"3":"URANINITE PITCHBLENDE URANIUM ORE 240","5":"rare negative botryoidal pitchblende, from Shaft 4 ,Pribram , Czech Rep. , 240 µsv/h with SBM-20@ 1cm, 4 cm x 3 cm x 2.3 cm , paypal or skrill only, ...","6":false,"7":44.0,"8":"USD"}}}},{"1":{"1":"https://antinuclear.files.wordpress.com/2012/07/mary-kathleen-uranium-mine.gif","3":504,"4":511},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRbQ8QiG595QEeGQbszjBqy3NSD10vD6HpMDRBbYl-uWgnz_14PEg","3":197,"4":200},"3":{"1":"Antinuclear","2":"https://antinuclear.net/2013/06/12/mary-kathleen-uranium-mine-still-toxic-decades-after-closure/","3":"Mary Kathleen uranium mine – still toxic decades after ...","4":"Mary-Kathleen-Uranium-mine-","10":"fLxfEgPYxMQMvS"},"5":{"1":"SGYSjGfHCKKNkgE"}},{"1":{"1":"https://stationeers-wiki.com/images/2/27/Uranium_ore_dropped.jpg","3":450,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSLJH30zkMiPth0cKLDb2Qlk2SN5BiTM_w_4LlZYthhktUasVRK","3":200,"4":200},"3":{"1":"Unofficial Stationeers Wiki","2":"https://stationeers-wiki.com/Uranium_Ore/en","3":"Uranium Ore - Unofficial Stationeers Wiki","4":"Uranium Ore","10":"XvrtvsArUYHKUS"},"5":{"1":"vKpjKTxbqkQXpom"}},{"1":{"1":"http://teachnuclear.ca/wp-content/uploads/2013/05/McClean-Lake-open-pit.jpg","3":640,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4RMtnL-xV_tEftv9YPNCde6Vo9HV_ZPeWz5wQ7h7l_KC3rnc4","3":200,"4":112},"3":{"1":"Teach Nuclear","2":"http://teachnuclear.ca/all-things-nuclear/nuclear-energy/uranium-mining/","3":"Uranium Mining | Teach Nuclear","4":"Open-pit mine at the McClean Lake facility","10":"scBFjbTjRhqPbE"},"5":{"1":"MjaBBUKfsXDRiUd"}},{"1":{"1":"https://media.istockphoto.com/photos/closeup-of-uranium-ore-on-white-background-picture-id183637629","3":1024,"4":1007},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR6H-joeozc8MoqQeO-qeGFLBp4M_2aUtIRkixABJY6Jye_Zu5d","3":200,"4":197},"3":{"1":"iStock","2":"https://www.istockphoto.com/photo/close-up-of-uranium-ore-on-white-background-gm183637629-27561251","3":"Closeup Of Uranium Ore On White Background Stock Photo & More ...","4":"Close-up of Uranium ore on white background royalty-free stock photo","10":"JjKfCVANlcxWUc"},"5":{"1":"KuRMAoXyPQEJKmd"}},{"1":{"1":"http://www.nsfwallet.com/wp-content/uploads/2013/09/41KH6M0LWJL._SL500_AA300_1.jpg","3":300,"4":300},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR00Ch9vyoO0x--dLLmB0io09RBtdpPBUn0rXF6_EEd4qwrnM6i","3":200,"4":200},"3":{"1":"Not Safe For Wallet","2":"http://www.nsfwallet.com/uranium-ore/","3":"Uranium Ore","4":"","10":"ROirCLHUnEFQbb"},"5":{"1":"bxMXuPXMbeiLMMR"}},{"1":{"1":"http://www.mirarr.net/media/W1siZiIsIjIwMTcvMDcvMDUvNWtocWNwZXp3eV9yYW5nZXIuanBnIl0sWyJwIiwidGh1bWIiLCIxMzIweDU4MSMiXV0/ranger.jpg","3":1320,"4":581},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_57SBkrYkxBS8nDl83hytJAgPncjLdd9EltlBrhZuy20i1NUl","3":199,"4":87},"3":{"1":"The Gundjeihmi Aboriginal Corporation","2":"http://www.mirarr.net/uranium-mining","3":"Uranium Mining – The Gundjeihmi Aboriginal Corporation","4":"Ranger. `","10":"lGQWpalAtncdQk"},"5":{"1":"wFBEtCKIsXalNQq"}},{"1":{"1":"http://1boidr1j8wt01itylm7cszo5r8.wpengine.netdna-cdn.com/wp-content/uploads/AUMmap.jpg","3":480,"4":360},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTtC0T56zTdoq3_XYpKrDW0Ssf1EroyWwXmXG8wASNsk2Yk1rCr","3":200,"4":149},"3":{"1":"The Colorado Independent","2":"http://www.coloradoindependent.com/147740/feds-open-door-to-more-uranium-mining-in-southwest-colorado","3":"Feds open door to more uranium mining in Southwest Colorado ...","4":"AUMmap","10":"TTnEbOQmDQMaKs"},"5":{"1":"GBNPxaatFaXEPnN"}},{"1":{"1":"http://eraengineers.com/wp-content/uploads/2016/03/uranium-yellowcake.jpg","3":620,"4":368},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ4pLb2LZOXRVSOtufN0gaWFlxWAtgQ_F-4Z9b1rmuhmd_SIT2xXQ","3":200,"4":118},"3":{"1":"Environmental Resource Associates","2":"http://eraengineers.com/portfolio-view/design-air-pollution-control-ventilation/","3":"Design of Air Pollution Controls and Local Ventilation for ...","4":"Design of Air Pollution Controls and Local Ventilation for Uranium Ore Processing Plant. «","10":"KOKKEMynLHcTBb"},"5":{"1":"WPQaqJyajPCkeqv"}},{"1":{"1":"http://unitednuclear.com/images/boxorocks.jpg","3":500,"4":535},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSkFRN9gmdSflSkBhW4q2lxTEq6qNFQnZ2hepJf0E7Xv1TcJFmrJA","3":187,"4":200},"3":{"1":"United Nuclear","2":"http://unitednuclear.com/index.php?main_page=product_info&products_id=863","3":"Bulk Uranium Ore Assortment - 5 Pounds : United Nuclear ...","4":"Bulk Uranium Ore Assortment - 5 Pounds","10":"yQyqhXaFvEoueR"},"5":{"1":"CQwbSsHmGnpLwXy"}},{"1":{"1":"https://i.pinimg.com/736x/9b/74/fa/9b74fa1a6c617880f3c027713b8ed0f0--uranium-nerdy.jpg","3":300,"4":232},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQgJUBQCVgGFCbVgsnD-uOQNuJ2lvpplHQYUQ7ce8lC54CiwVvJAg","3":200,"4":154},"3":{"1":"Pinterest","2":"https://www.pinterest.com/michaels0582/uranium-ore/","3":"31 best Uranium Ore images on Pinterest | Crystals, Petroleum ...","4":"Bulk Uranium Ore - 5 Pounds : United Nuclear , Scientific Equipment & Supplies","10":"VmLBugwkJfYpdv"},"5":{"1":"bRwiTmKbMptmoFd"}},{"1":{"1":"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Marienberg_ore.jpg/220px-Marienberg_ore.jpg","3":220,"4":165},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTVSeTQx_j1CbsN7N3OlSt3Y_ze7MRNPycZj_A07Dn24YEuLRYf","3":200,"4":150},"3":{"1":"Wikipedia","2":"https://en.wikipedia.org/wiki/Uranium_ore","3":"Uranium ore - Wikipedia","4":"Polymetallic uranium ore, Marienberg, Erzgebirge Mts, Germany","10":"oBhUVtBxxpQMct"},"5":{"1":"oGENeuUvxqvGwhY"}},{"1":{"1":"https://www.researchgate.net/profile/Dr_Yamuna_Singh/publication/316716402/figure/fig4/AS:491343119163393@1494156736236/Megascopic-view-of-uranium-ore-sample-used-for-study-Note-a-relict-core-of-black-mineral.png","3":626,"4":538},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ0B9_kwbnm5JXAw-YOZPCMB9sfJyyO9ady26FX7tbJWS-pPZyJ","3":199,"4":171},"3":{"1":"ResearchGate","2":"https://www.researchgate.net/figure/Megascopic-view-of-uranium-ore-sample-used-for-study-Note-a-relict-core-of-black-mineral_fig4_316716402","3":"Fig. 4. Megascopic view of uranium ore sample used for study ...","4":"Megascopic view of uranium ore sample used for study. Note a relict core of black mineral (uraninite) ...","10":"duflncOKBLXPEx"},"5":{"1":"bwNLaAuVAWvOYxj"}},{"1":{"1":"http://cdn.iofferphoto.com/img3/item/640/729/747/uraninite-pyrite-pitchblende-uranium-ore-230-0ac1.jpg","3":580,"4":386},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTV9n1j2oibvPRX86LkJXrUwHuavrxaNZ41wi4gmV7jOEI-SGcbjg","3":200,"4":133},"3":{"1":"iOffer","2":"http://payments.ioffer.com/i/uraninite-pyrite-pitchblende-uranium-ore-230-640729747","3":"URANINITE + Pyrite PITCHBLENDE URANIUM ORE 230 for sale","4":"URANINITE + Pyrite PITCHBLENDE URANIUM ORE 230. «","10":"BXSwLQenDcTqYd"},"5":{"1":"llsvaTDqVOyMdSS"},"7":{"1":{"10":{"1":5.0,"3":"URANINITE + Pyrite PITCHBLENDE URANIUM ORE 230","5":"uraninite with pyrite (stable) on matrix from Dubenec, Pribram , Czech Rep. , 230 µsv/h with SBM-20@ 1cm , 6.4 cm x 4.7 cm x 3.5 cm , boxed , 155g, ...","6":false,"7":65.0,"8":"USD"}}}},{"1":{"1":"https://thumbs.dreamstime.com/b/uranium-ore-9727818.jpg","3":800,"4":800},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSmOQiJLTEC8IUbP-J8cA1Lk04kgZBnfCs03hjz8XxFcUnULkVg","3":200,"4":200},"3":{"1":"Dreamstime.com","2":"https://www.dreamstime.com/royalty-free-stock-photos-uranium-ore-image9727818","3":"Uranium ore stock photo. Image of radium, rays, environmental ...","4":"Download Uranium ore stock photo. Image of radium, rays, environmental - 9727818","10":"PpKDilVVidtdAh"},"5":{"1":"BCPoeqSVHwLqKpu"}},{"1":{"1":"https://www.sciencephoto.com/image/78646/530wm","3":530,"4":364},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSzl6fxehVSwPTJDfNmmKM0e9GD6mKJ2TFvP-fhFUmE9G0xiGkJsA","3":200,"4":137},"3":{"1":"Science Photo Library","2":"https://www.sciencephoto.com/media/78646/view/-autunite-a-uranium-ore-","3":"Autunite, a Uranium Ore' - Stock Image C001/4244 - Science ...","4":"'Autunite, a Uranium Ore'","10":"EDmfQyiLaYeGiq"},"5":{"1":"cLFDrRSdxooTyfX"}},{"1":{"1":"https://i.kinja-img.com/gawker-media/image/upload/s--GJZHACFy--/c_scale,f_auto,fl_progressive,q_80,w_800/1444652809032333604.jpg","3":800,"4":450},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS7eJp8DHn5uknUUaBQM8FX1ZbrP6BFLG5Hcxgl1QN5k7nFf2sm","3":200,"4":112},"3":{"1":"io9 - Gizmodo","2":"https://io9.gizmodo.com/what-happens-when-you-put-acid-on-uranium-ore-find-out-1732733166","3":"What Happens When You Put Acid on Uranium Ore? Find Out!","4":"","10":"ivMcBfdMUrSuTq"},"5":{"1":"NmYiuMoOFDeXWFB"}},{"1":{"1":"https://quatr.us/wp-content/uploads/2017/06/uranium.jpg","3":250,"4":268},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcShlD81v12IPVrUwlby7X_gfp_lPKFcgjAlbZ8sfTjRoBp9p6ekCg","3":187,"4":200},"3":{"1":"Quatr.us","2":"https://quatr.us/chemistry/uranium-atoms-elements-chemistry.htm","3":"What is uranium? Atoms, elements, chemistry | Quatr.us Study ...","4":"A piece of uranium ore","10":"LggyIdLfTHPoUE"},"5":{"1":"PDBjsuOVuDrmnRH"}},{"1":{"1":"http://www.radioactivethings.com/_Media/full-size-2.jpeg","3":1537,"4":1920},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ03YLxtAgZB6haLu1HOHiWCqtFIxFH-y27WA-xJN9B0Fi7B3X5","3":160,"4":200},"3":{"2":"http://www.radioactivethings.com/","3":"RadioactiveThings.com","4":"As Major General Nichols of the Manhattan project put it: \"Our best source, the Shinkolobwe mine, ...","10":"kcddveXePECqkk"},"5":{"1":"FsqBhrfUURQcKHI"}},{"1":{"1":"http://talknuclear.ca/wp-content/uploads/2014/08/radiation-from-bananas.jpg","3":599,"4":641},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSlhqhU7yHlFVuI5YFnhnudkAOouIrYTetWsAPQ8OSwYbz8AFr1","3":187,"4":200},"3":{"1":"TalkNuclear","2":"http://talknuclear.ca/2014/08/just-how-radioactive-is-uranium-ore/","3":"Just How Radioactive is Uranium Ore? | TalkNuclear","4":"radiation from bananas","10":"JeIVstWCOVqrYN"},"5":{"1":"JbifUMcnhPfcvxU"}},{"1":{"1":"https://previews.123rf.com/images/merial1/merial11205/merial1120500076/13672876-uranium-ore-uraninite-from-pribram-czech-republic.jpg","3":1300,"4":1038},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQCyxlmproQBZz6Vw97Xu0No5l7N8s0BTt_HrvRm7HI4jL7fNmb","3":200,"4":160},"3":{"1":"123RF.com","2":"https://www.123rf.com/photo_13672876_uranium-ore-uraninite-from-pribram-czech-republic.html","3":"Uranium Ore (uraninite) From Pribram, Czech Republic Stock ...","4":"Uranium ore (uraninite) from Pribram, Czech republic Stock Photo - 13672876","10":"jGfydBHejDNsUv"},"5":{"1":"spMNHbdmpmkhhPI"}},{"1":{"1":"https://images.enca.com/encadrupal/styles/600_383/s3/WEB_PHOTO_KAROO_RYSTKUIL_05032016.jpg","3":600,"4":383},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT9dFVWftqcZ4hgMriqLFGNOhcDPD9iiwWipfkxyFbYTgyG5N7u","3":200,"4":127},"3":{"1":"eNCA","2":"http://www.enca.com/south-africa/uranium-mining-karoo-south-africas-new-gold","3":"Uranium mining in the Karoo South Africa's new gold?","4":"The entrance to the Cameron shaft, an old uranium trial mine 40km from Beaufort West.","10":"TuhPBLPjSHnFFr"},"5":{"1":"TfETPSaOJhXBxDu"}},{"1":{"1":"http://www.world-nuclear.org/getattachment/Nuclear-Basics/How-is-uranium-ore-made-into-nuclear-fuel/yellowcake-(Cameco).jpg.aspx?","3":709,"4":915},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQfCvtqHk8x539fQ_UFrgd5sKuAEKtHeVifrIrAnyqoLFfyijEKUQ","3":155,"4":200},"3":{"1":"World Nuclear Association","2":"http://www.world-nuclear.org/nuclear-basics/how-is-uranium-ore-made-into-nuclear-fuel.aspx","3":"How uranium ore is made into nuclear fuel - World Nuclear ...","4":"yellowcake-(Cameco).jpg","10":"EgOqgwGpPvWtNo"},"5":{"1":"deoFQVqsXRHBxDx"}},{"1":{"1":"https://media.gettyimages.com/photos/kilogram-of-uranium-ore-gives-merely-37-grams-of-yellow-cake-in-mine-picture-id844444270","3":1024,"4":683},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT8FrUCgyfEdOSaMt3n3diQQK_CofwQcGS85fOnJg07RMeM71ec","3":200,"4":133},"3":{"1":"Getty Images","2":"https://www.gettyimages.com/detail/news-photo/kilogram-of-uranium-ore-gives-merely-37-grams-of-yellow-news-photo/844444270","3":"Inside Indias secure uranium processing facility Pictures ...","4":"JADUGODA, JHARKAHND, INDIA - SEPTEMBER 03: A 100 kilogram of uranium ore gives","10":"CBBCmdctDTjUYS"},"5":{"1":"wcimccDXRxrPPYo"}},{"1":{"1":"https://ae01.alicdn.com/kf/HTB1X_yaLpXXXXbtXXXXq6xXFXXXS/Domestic-rare-autunite-fluorescent-Mica-natural-uranium-ore-original-stone-mineral-specimens-H1024.jpg_640x640.jpg","3":639,"4":640},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRvFFjVksCk-mht4Bki6CGFuGeLDrzAn8RxL84tEauRoyuuuS1t","3":199,"4":200},"3":{"1":"AliExpress.com","2":"https://www.aliexpress.com/item/Domestic-rare-autunite-fluorescent-Mica-natural-uranium-ore-original-stone-mineral-specimens-H1024/32594437365.html","3":"Domestic rare autunite fluorescent Mica natural uranium ore ...","4":"Domestic rare autunite fluorescent Mica natural uranium ore original stone mineral specimens H1024","10":"LGJotHvCumpisG"},"5":{"1":"PHYmmwVGNgxyWXQ"},"7":{"1":{"10":{"3":"Domestic rare autunite fluorescent Mica natural uranium ore original stone mineral specimens H1024 on Aliexpress.com | Alibaba Group","6":false,"7":856.7999877929688,"8":"USD"}}}},{"1":{"1":"https://vignette.wikia.nocookie.net/thetekkit/images/8/88/Uranium_Ore.png/revision/latest?cb=20121011054131","3":256,"4":256},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQhqcbjnHtAH4CZb_F1qk6JU_T4vSYyE8PnZduQj3Wc8nBV1OUw","3":200,"4":200},"3":{"1":"The Tekkit Classic Wiki - Fandom","2":"http://tekkitclassic.wikia.com/wiki/Uranium_Ore","3":"Uranium Ore | The Tekkit Classic Wiki | FANDOM powered by Wikia","4":"Uranium Ore","10":"fbHJlnOSnoAlXg"},"5":{"1":"LKECMxeYlJQYQvx"}},{"1":{"1":"http://pcbheaven.com/opendir/images/thumbs/od_1281_4_1340220138.png","3":500,"4":334},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTfyHMiuy7oPGB1SaoPbdwAvG0u32Vc-nBmQX64YIqQvoP3vByYUg","3":200,"4":133},"3":{"1":"Hesed.info","2":"http://hesed.info/blog/yellowcake-uranium-ore.abp","3":"Yellowcake Uranium Ore","4":"","10":"bEvuSpOOWAaPlY"},"5":{"1":"CSCohElwJwuXNPc"}},{"1":{"1":"https://keanchancom.files.wordpress.com/2016/06/uranium-ore.jpg","3":1024,"4":768},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZjU6qvNMW95223xEEvNN3XYlPx8R12QV3dbjh1-5vTpHLkDmCHw","3":200,"4":149},"3":{"1":"Hitman Game","2":"http://the.hitmangame.info/jpg/fluorescent-uranium-ore.php","3":"Fluorescent Uranium Ore - Hitman Game","4":"Fluorescent Uranium Ore","10":"KwgdiKaesnYMur"},"5":{"1":"XirjwbBuBUlIjJX"}},{"1":{"1":"https://i.ytimg.com/vi/vNbV4whWHsQ/maxresdefault.jpg","3":1280,"4":720},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRqKbVcx3LMW1wZ8aghfTW9JKDQPYXD0LqNrjPLPPwLE09ABedF9A","3":200,"4":112},"3":{"1":"YouTube","2":"https://www.youtube.com/watch?v=vNbV4whWHsQ","3":"Uranium Ores -The Better - YouTube","4":"Uranium Ores -The Better","10":"cmwKHdELShqVIL"},"5":{"1":"uLnJXqtjVcLJSBT"},"7":{"1":{"11":{"1":"Uranium Ores -The Better","2":"If you collect rocks, its a good idea to part the specimens in 3 groups: good - better - best These specimens in the video are in my group \"better\" The \"best...","3":"12:25","4":"737","5":"1484438400000","6":"weirdmeister inc.","7":"18","8":"15"}}}},{"1":{"1":"https://www.mining-technology.com/wp-content/uploads/sites/8/2017/10/1-image-Australia.jpg","3":600,"4":400},"2":{"1":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRDRzupy-lorOlAP0d-CEOFeHwOPm3o79KIYPpZ_yeQZvwIt3uB","3":200,"4":133},"3":{"1":"Mining Technology","2":"https://www.mining-technology.com/features/featureradioactive-riches-the-five-biggest-uranium-rich-countries-4274059/","3":"Radioactive riches – the five countries with the biggest ...","4":"Australia's Ranger mine is the world's third biggest uranium producing mine.","10":"YfKTBasdlWQntu"},"5":{"1":"DtGOUiEJFvqvbnO"}}],"2":3} \ No newline at end of file diff --git a/benchmarks/IsolateSendExitLatency/dart2/IsolateSendExitLatency.dart b/benchmarks/IsolateSendExitLatency/dart2/IsolateSendExitLatency.dart deleted file mode 100644 index d4befa6d4dd..00000000000 --- a/benchmarks/IsolateSendExitLatency/dart2/IsolateSendExitLatency.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// This test ensures that there are no long pauses when sending large objects -// via exit/send. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:typed_data'; -import 'dart:math' as math; -import 'dart:isolate'; - -import 'latency.dart'; - -main() async { - final statsFuture = measureEventLoopLatency( - const Duration(milliseconds: 1), - 4000, - work: () { - // Every 1 ms we allocate some objects which may trigger GC some time. - for (int i = 0; i < 32; i++) { - List.filled(32 * 1024 ~/ 8, null); - } - }, - ); - - final result = await compute(() { - final l = []; - for (int i = 0; i < 10 * 1000 * 1000; ++i) { - l.add(Object()); - } - return l; - }); - if (result.length != 10 * 1000 * 1000) throw 'failed'; - - final stats = await statsFuture; - stats.report('IsolateSendExitLatency'); -} - -Future compute(T Function() fun) { - final rp = ReceivePort(); - final sp = rp.sendPort; - Isolate.spawn((_) { - final value = fun(); - Isolate.exit(sp, value); - }, null); - return rp.first.then((t) => t as T); -} diff --git a/benchmarks/IsolateSendExitLatency/dart2/latency.dart b/benchmarks/IsolateSendExitLatency/dart2/latency.dart deleted file mode 100644 index 4435eba554f..00000000000 --- a/benchmarks/IsolateSendExitLatency/dart2/latency.dart +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:io'; -import 'dart:math' as math; -import 'dart:typed_data'; - -/// Measures event loop responsiveness. -/// -/// Schedules new timer events, [tickDuration] in the future, and measures how -/// long it takes for these events to actually arrive. -/// -/// Runs [numberOfTicks] times before completing with [EventLoopLatencyStats]. -Future measureEventLoopLatency( - Duration tickDuration, - int numberOfTicks, { - void Function() work, -}) { - final completer = Completer(); - - final tickDurationInUs = tickDuration.inMicroseconds; - final buffer = _TickLatencies(numberOfTicks); - final sw = Stopwatch()..start(); - int lastTimestamp = 0; - - void trigger() { - final int currentTimestamp = sw.elapsedMicroseconds; - - // Every tick we missed to schedule we'll add with difference to when we - // would've scheduled it and when we became responsive again. - bool done = false; - while (!done && lastTimestamp < (currentTimestamp - tickDurationInUs)) { - done = !buffer.add(currentTimestamp - lastTimestamp - tickDurationInUs); - lastTimestamp += tickDurationInUs; - } - - if (work != null) { - work(); - } - - if (!done) { - lastTimestamp = currentTimestamp; - Timer(tickDuration, trigger); - } else { - completer.complete(buffer.makeStats()); - } - } - - Timer(tickDuration, trigger); - - return completer.future; -} - -/// Result of the event loop latency measurement. -class EventLoopLatencyStats { - /// Minimum latency between scheduling a tick and it's arrival (in ms). - final double minLatency; - - /// Average latency between scheduling a tick and it's arrival (in ms). - final double avgLatency; - - /// Maximum latency between scheduling a tick and it's arrival (in ms). - final double maxLatency; - - /// The 50th percentile (median) (in ms). - final double percentile50th; - - /// The 90th percentile (in ms). - final double percentile90th; - - /// The 95th percentile (in ms). - final double percentile95th; - - /// The 99th percentile (in ms). - final double percentile99th; - - EventLoopLatencyStats( - this.minLatency, - this.avgLatency, - this.maxLatency, - this.percentile50th, - this.percentile90th, - this.percentile95th, - this.percentile99th, - ); - - void report(String name) { - print('$name.Min(RunTimeRaw): $minLatency ms.'); - print('$name.Avg(RunTimeRaw): $avgLatency ms.'); - print('$name.Percentile50(RunTimeRaw): $percentile50th ms.'); - print('$name.Percentile90(RunTimeRaw): $percentile90th ms.'); - print('$name.Percentile95(RunTimeRaw): $percentile95th ms.'); - print('$name.Percentile99(RunTimeRaw): $percentile99th ms.'); - print('$name.Max(RunTimeRaw): $maxLatency ms.'); - } -} - -/// Accumulates tick latencies and makes statistics for it. -class _TickLatencies { - final Uint64List _timestamps; - int _index = 0; - - _TickLatencies(int numberOfTicks) : _timestamps = Uint64List(numberOfTicks); - - /// Returns `true` while the buffer has not been filled yet. - bool add(int latencyInUs) { - _timestamps[_index++] = latencyInUs; - return _index < _timestamps.length; - } - - EventLoopLatencyStats makeStats() { - if (_index != _timestamps.length) { - throw 'Buffer has not been fully filled yet.'; - } - - _timestamps.sort(); - final length = _timestamps.length; - final double avg = _timestamps.fold(0, (int a, int b) => a + b) / length; - final int min = _timestamps.fold(0x7fffffffffffffff, math.min); - final int max = _timestamps.fold(0, math.max); - final percentile50th = _timestamps[50 * length ~/ 100]; - final percentile90th = _timestamps[90 * length ~/ 100]; - final percentile95th = _timestamps[95 * length ~/ 100]; - final percentile99th = _timestamps[99 * length ~/ 100]; - - return EventLoopLatencyStats( - min / 1000, - avg / 1000, - max / 1000, - percentile50th / 1000, - percentile90th / 1000, - percentile95th / 1000, - percentile99th / 1000, - ); - } -} diff --git a/benchmarks/IsolateSpawn/dart2/IsolateSpawn.dart b/benchmarks/IsolateSpawn/dart2/IsolateSpawn.dart deleted file mode 100644 index d8391cada0f..00000000000 --- a/benchmarks/IsolateSpawn/dart2/IsolateSpawn.dart +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:isolate'; -import 'dart:math'; - -import 'package:meta/meta.dart'; - -import 'package:compiler/src/dart2js.dart' as dart2js_main; - -class SpawnLatency { - SpawnLatency(this.name); - - Future run() async { - final completerResult = Completer(); - final receivePort = ReceivePort()..listen(completerResult.complete); - final isolateExitedCompleter = Completer(); - final onExitReceivePort = - ReceivePort()..listen((_) { - isolateExitedCompleter.complete(DateTime.now()); - }); - final beforeSpawn = DateTime.now(); - await Isolate.spawn( - isolateCompiler, - StartMessageLatency(receivePort.sendPort, beforeSpawn), - onExit: onExitReceivePort.sendPort, - onError: onExitReceivePort.sendPort, - ); - final afterSpawn = DateTime.now(); - - final ResultMessageLatency result = await completerResult.future; - receivePort.close(); - final DateTime isolateExited = await isolateExitedCompleter.future; - result.timeToExitUs = isolateExited.difference(beforeSpawn).inMicroseconds; - result.timeToIsolateSpawnUs = - afterSpawn.difference(beforeSpawn).inMicroseconds; - onExitReceivePort.close(); - - return result; - } - - Future measureFor(int minimumMillis) async { - final minimumMicros = minimumMillis * 1000; - final watch = Stopwatch()..start(); - final Metric toAfterIsolateSpawnUs = LatencyMetric('${name}ToAfterSpawn'); - final Metric toStartRunningCodeUs = LatencyMetric('${name}ToStartRunning'); - final Metric toFinishRunningCodeUs = LatencyMetric( - '${name}ToFinishRunning', - ); - final Metric toExitUs = LatencyMetric('${name}ToExit'); - while (watch.elapsedMicroseconds < minimumMicros) { - final result = await run(); - toAfterIsolateSpawnUs.add(result.timeToIsolateSpawnUs); - toStartRunningCodeUs.add(result.timeToStartRunningCodeUs); - toFinishRunningCodeUs.add(result.timeToFinishRunningCodeUs); - toExitUs.add(result.timeToExitUs); - } - return AggregatedResultMessageLatency( - toAfterIsolateSpawnUs, - toStartRunningCodeUs, - toFinishRunningCodeUs, - toExitUs, - ); - } - - Future measure() async { - await measureFor(500); // warm-up - return measureFor(4000); // actual measurement - } - - Future report() async { - final result = await measure(); - print(result); - } - - final String name; - RawReceivePort receivePort; -} - -class Metric { - Metric({@required this.prefix, @required this.suffix}); - - void add(int value) { - if (value > max) { - max = value; - } - sum += value; - sumOfSquares += value * value; - count++; - } - - double _average() => sum / count; - double _rms() => sqrt(sumOfSquares / count); - - @override - String toString() => - '$prefix): ${_average()}$suffix\n' - '${prefix}Max): $max$suffix\n' - '${prefix}RMS): ${_rms()}$suffix'; - - final String prefix; - final String suffix; - int max = 0; - double sum = 0; - double sumOfSquares = 0; - int count = 0; -} - -class LatencyMetric extends Metric { - LatencyMetric(String name) : super(prefix: '$name(Latency', suffix: ' us.'); -} - -class StartMessageLatency { - StartMessageLatency(this.sendPort, this.spawned); - - final SendPort sendPort; - final DateTime spawned; -} - -class ResultMessageLatency { - ResultMessageLatency({ - this.timeToStartRunningCodeUs, - this.timeToFinishRunningCodeUs, - this.deltaHeap, - }); - - final int timeToStartRunningCodeUs; - final int timeToFinishRunningCodeUs; - final int deltaHeap; - - int timeToIsolateSpawnUs; - int timeToExitUs; -} - -class AggregatedResultMessageLatency { - AggregatedResultMessageLatency( - this.toAfterIsolateSpawnUs, - this.toStartRunningCodeUs, - this.toFinishRunningCodeUs, - this.toExitUs, - ); - - @override - String toString() => '''$toAfterIsolateSpawnUs -$toStartRunningCodeUs -$toFinishRunningCodeUs -$toExitUs'''; - - final Metric toAfterIsolateSpawnUs; - final Metric toStartRunningCodeUs; - final Metric toFinishRunningCodeUs; - final Metric toExitUs; -} - -Future isolateCompiler(StartMessageLatency start) async { - final timeRunningCodeUs = DateTime.now(); - await runZoned( - () => dart2js_main.internalMain([ - 'benchmarks/IsolateSpawn/dart/helloworld.dart', - '--libraries-spec=sdk/lib/libraries.json', - ]), - zoneSpecification: ZoneSpecification( - print: (Zone self, ZoneDelegate parent, Zone zone, String line) {}, - ), - ); - final timeFinishRunningCodeUs = DateTime.now(); - start.sendPort.send( - ResultMessageLatency( - timeToStartRunningCodeUs: - timeRunningCodeUs.difference(start.spawned).inMicroseconds, - timeToFinishRunningCodeUs: - timeFinishRunningCodeUs.difference(start.spawned).inMicroseconds, - ), - ); -} - -Future main() async { - await SpawnLatency('IsolateSpawn.Dart2JS').report(); -} diff --git a/benchmarks/IsolateSpawn/dart2/helloworld.dart b/benchmarks/IsolateSpawn/dart2/helloworld.dart deleted file mode 100644 index 6b0f19134ab..00000000000 --- a/benchmarks/IsolateSpawn/dart2/helloworld.dart +++ /dev/null @@ -1,5 +0,0 @@ -// @dart=2.9 - -void main() { - print('Hello, world!'); -} diff --git a/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart b/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart deleted file mode 100644 index 2cf8b633767..00000000000 --- a/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:developer'; -import 'dart:io'; -import 'dart:isolate'; -import 'dart:math' as math; - -import 'package:compiler/src/dart2js.dart' as dart2js_main; -import 'package:vm_service/vm_service.dart' as vm_service; -import 'package:vm_service/vm_service_io.dart' as vm_service_io; - -const String compilerIsolateName = 'isolate-compiler'; - -class Result { - const Result( - this.rssOnStart, - this.rssOnEnd, - this.heapOnStart, - this.heapOnEnd, - ); - - final int rssOnStart; - final int rssOnEnd; - final int heapOnStart; - final int heapOnEnd; -} - -class StartMessage { - const StartMessage(this.wsUri, this.sendPort); - - final String wsUri; - final SendPort sendPort; -} - -class SpawnMemory { - SpawnMemory(this.name, this.wsUri); - - Future report() async { - int maxProcessRss = 0; - final timer = Timer.periodic(const Duration(microseconds: 100), (_) { - maxProcessRss = math.max(maxProcessRss, ProcessInfo.currentRss); - }); - - const numberOfBenchmarks = 3; - - final beforeRss = ProcessInfo.currentRss; - final beforeHeap = await currentHeapUsage(wsUri); - - final iterators = []; - final continuations = []; - - // Start all isolates & make them wait. - for (int i = 0; i < numberOfBenchmarks; i++) { - final receivePort = ReceivePort(); - final startMessage = StartMessage(wsUri, receivePort.sendPort); - await Isolate.spawn( - isolateCompiler, - startMessage, - debugName: compilerIsolateName, - ); - final iterator = StreamIterator(receivePort); - - if (!await iterator.moveNext()) throw 'failed'; - continuations.add(iterator.current as SendPort); - - iterators.add(iterator); - } - - final readyRss = ProcessInfo.currentRss; - final readyHeap = await currentHeapUsage(wsUri); - - // Let all isolates do the dart2js compilation. - for (int i = 0; i < numberOfBenchmarks; i++) { - final iterator = iterators[i]; - final continuation = continuations[i]; - continuation.send(null); - if (!await iterator.moveNext()) throw 'failed'; - if (iterator.current != 'done') throw 'failed'; - } - - final doneRss = ProcessInfo.currentRss; - final doneHeap = await currentHeapUsage(wsUri); - - // Shut down helper isolates - for (int i = 0; i < numberOfBenchmarks; i++) { - final iterator = iterators[i]; - final continuation = continuations[i]; - continuation.send(null); - if (!await iterator.moveNext()) throw 'failed'; - if (iterator.current != 'shutdown') throw 'failed'; - await iterator.cancel(); - } - timer.cancel(); - - final readyDiffRss = - math.max(0, readyRss - beforeRss) ~/ numberOfBenchmarks; - final readyDiffHeap = - math.max(0, readyHeap - beforeHeap) ~/ numberOfBenchmarks; - final doneDiffRss = math.max(0, doneRss - beforeRss) ~/ numberOfBenchmarks; - final doneDiffHeap = - math.max(0, doneHeap - beforeHeap) ~/ numberOfBenchmarks; - - print('${name}RssOnStart(MemoryUse): $readyDiffRss'); - print('${name}RssOnEnd(MemoryUse): $doneDiffRss'); - print('${name}HeapOnStart(MemoryUse): $readyDiffHeap'); - print('${name}HeapOnEnd(MemoryUse): $doneDiffHeap'); - print('${name}PeakProcessRss(MemoryUse): $maxProcessRss'); - } - - final String name; - final String wsUri; -} - -Future isolateCompiler(StartMessage startMessage) async { - final port = ReceivePort(); - final iterator = StreamIterator(port); - - // Let main isolate know we're ready. - startMessage.sendPort.send(port.sendPort); - await iterator.moveNext(); - - await runZoned( - () => dart2js_main.internalMain([ - 'benchmarks/IsolateSpawnMemory/dart/helloworld.dart', - '--libraries-spec=sdk/lib/libraries.json', - ]), - zoneSpecification: ZoneSpecification( - print: (Zone self, ZoneDelegate parent, Zone zone, String line) {}, - ), - ); - - // Let main isolate know we're done. - startMessage.sendPort.send('done'); - await iterator.moveNext(); - - // Closes the port. - startMessage.sendPort.send('shutdown'); - await iterator.cancel(); -} - -Future currentHeapUsage(String wsUri) async { - final vmService = await vm_service_io.vmServiceConnectUri(wsUri); - final groupIds = await getGroupIds(vmService); - int sum = 0; - for (final groupId in groupIds) { - final usage = await vmService.getIsolateGroupMemoryUsage(groupId); - sum += usage.heapUsage + usage.externalUsage; - } - vmService.dispose(); - return sum; -} - -Future main() async { - // Only if we successfully reach the end will we set 0 exit code. - exitCode = 255; - - final info = await Service.controlWebServer(enable: true); - final observatoryUri = info.serverUri; - final wsUri = 'ws://${observatoryUri.authority}${observatoryUri.path}ws'; - await SpawnMemory('IsolateSpawnMemory.Dart2JSDelta', wsUri).report(); - - // Only if we successfully reach the end will we set 0 exit code. - exitCode = 0; -} - -// Returns the set of isolate groups for which we should count the heap usage. -Future> getGroupIds(vm_service.VmService vmService) async { - final groupIds = {}; - final vm = await vmService.getVM(); - for (final groupRef in vm.isolateGroups) { - final group = await vmService.getIsolateGroup(groupRef.id); - for (final isolateRef in group.isolates) { - final isolateOrSentinel = await vmService.getIsolate(isolateRef.id); - if (isolateOrSentinel is vm_service.Isolate) { - groupIds.add(groupRef.id); - } - } - } - if (groupIds.isEmpty) { - throw 'Could not find main isolate'; - } - return groupIds.toList(); -} diff --git a/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart b/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart deleted file mode 100644 index 6b0f19134ab..00000000000 --- a/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart +++ /dev/null @@ -1,5 +0,0 @@ -// @dart=2.9 - -void main() { - print('Hello, world!'); -} diff --git a/benchmarks/Iterators/dart2/Iterators.dart b/benchmarks/Iterators/dart2/Iterators.dart deleted file mode 100644 index cc035152104..00000000000 --- a/benchmarks/Iterators/dart2/Iterators.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import '../dart/Iterators.dart' as benchmark; - -void main(List arguments) { - benchmark.main(arguments); -} diff --git a/benchmarks/ListCopy/dart2/ListCopy.dart b/benchmarks/ListCopy/dart2/ListCopy.dart deleted file mode 100644 index f05c5dd7e25..00000000000 --- a/benchmarks/ListCopy/dart2/ListCopy.dart +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:collection'; -import 'dart:typed_data'; -import 'package:benchmark_harness/benchmark_harness.dart'; - -// Benchmark for polymorphic list copying. -// -// Each benchmark creates a list from an Iterable. There are many slightly -// different ways to do this. -// -// In each benchmark the call site is polymorphic in the input type to simulate -// the behaviour of library methods in the context of a large application. The -// input lists are skewed heavily to the default growable list. This attempts to -// model 'real world' copying of 'ordinary' lists. -// -// The benchmarks are run for small lists (2 elements, names ending in -// `.2`) and 'large' lists (100 elements or `.100`). The benchmarks are -// normalized on the number of elements to make the input sizes comparable. -// -// Most inputs have type `Iterable`, but contain only `int` values. This -// allows is to compare the down-conversion versions of copying where each -// element must be checked. - -class Benchmark extends BenchmarkBase { - final int length; - final Function() copy; - - final List> inputs = []; - - Benchmark(String name, this.length, this.copy) - : super('ListCopy.$name.$length'); - - @override - void setup() { - // Ensure setup() is idempotent. - if (inputs.isNotEmpty) return; - final List base = List.generate(length, (i) => i + 1); - List> makeVariants() { - return [ - // Weight ordinary lists more. - ...List.generate(19, (_) => List.of(base)), - - base.toList(growable: false), - List.unmodifiable(base), - UnmodifiableListView(base), - base.reversed, - String.fromCharCodes(List.from(base)).codeUnits, - Uint8List.fromList(List.from(base)), - ]; - } - - const elements = 10000; - int totalLength = 0; - while (totalLength < elements) { - final variants = makeVariants(); - inputs.addAll(variants); - totalLength += variants.fold( - 0, - (sum, iterable) => sum + iterable.length, - ); - } - - // Sanity checks. - for (var sample in inputs) { - if (sample.length != length) throw 'Wrong length: $length $sample'; - } - if (totalLength != elements) { - throw 'totalLength $totalLength != expected $elements'; - } - } - - @override - void run() { - for (var sample in inputs) { - input = sample; - // Unroll loop 10 times to reduce loop overhead, which is about 15% for - // the fastest short input benchmarks. - copy(); - copy(); - copy(); - copy(); - copy(); - copy(); - copy(); - copy(); - copy(); - copy(); - } - if (output.length != inputs.first.length) throw 'Bad result: $output'; - } -} - -// All the 'copy' methods use [input] and [output] rather than a parameter and -// return value to avoid any possibility of type check in the call sequence. -Iterable input = const []; -var output; - -List makeBenchmarks(int length) => [ - Benchmark('toList', length, () { - output = input.toList(); - }), - Benchmark('toList.fixed', length, () { - output = input.toList(growable: false); - }), - Benchmark('List.of', length, () { - output = List.of(input); - }), - Benchmark('List.of.fixed', length, () { - output = List.of(input, growable: false); - }), - Benchmark('List.num.from', length, () { - output = List.from(input); - }), - Benchmark('List.int.from', length, () { - output = List.from(input); - }), - Benchmark('List.num.from.fixed', length, () { - output = List.from(input, growable: false); - }), - Benchmark('List.int.from.fixed', length, () { - output = List.from(input, growable: false); - }), - Benchmark('List.num.unmodifiable', length, () { - output = List.unmodifiable(input); - }), - Benchmark('List.int.unmodifiable', length, () { - output = List.unmodifiable(input); - }), - Benchmark('spread.num', length, () { - output = [...input]; - }), - Benchmark('spread.int', length, () { - output = [...input]; - }), - Benchmark('spread.int.cast', length, () { - output = [...input.cast()]; - }), - Benchmark('spread.int.map', length, () { - output = [...input.map((x) => x as int)]; - }), - Benchmark('for.int', length, () { - output = [for (var n in input) n as int]; - }), -]; - -void main() { - final benchmarks = [...makeBenchmarks(2), ...makeBenchmarks(100)]; - - // Warmup all benchmarks to ensure JIT compilers see full polymorphism. - for (var benchmark in benchmarks) { - benchmark.setup(); - } - - for (var benchmark in benchmarks) { - benchmark.warmup(); - } - - for (var benchmark in benchmarks) { - // `report` calls `setup`, but `setup` is idempotent. - benchmark.report(); - } -} diff --git a/benchmarks/MD5/dart2/md5.dart b/benchmarks/MD5/dart2/md5.dart deleted file mode 100644 index 8ecd0095cc2..00000000000 --- a/benchmarks/MD5/dart2/md5.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; -import 'package:convert/convert.dart'; -import 'package:crypto/crypto.dart'; - -const size = 8 * 1024; -const expected = '6556112372898c69e1de0bf689d8db26'; - -class MD5Bench extends BenchmarkBase { - List data; - - MD5Bench() : super('MD5') { - data = List.filled(size, null); - for (int i = 0; i < data.length; i++) { - data[i] = i % 256; - } - } - - @override - void run() { - final hash = md5.convert(data); - if (hex.encode(hash.bytes) != expected) { - throw 'Incorrect HASH computed.'; - } - } -} - -void main() { - MD5Bench().report(); -} diff --git a/benchmarks/MapCopy/dart2/MapCopy.dart b/benchmarks/MapCopy/dart2/MapCopy.dart deleted file mode 100644 index 3f7c000eff2..00000000000 --- a/benchmarks/MapCopy/dart2/MapCopy.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import '../dart/MapCopy.dart' as benchmark; - -void main(List arguments) { - benchmark.main(arguments); -} diff --git a/benchmarks/MapLookup/dart2/MapLookup.dart b/benchmarks/MapLookup/dart2/MapLookup.dart deleted file mode 100644 index d7593f84bba..00000000000 --- a/benchmarks/MapLookup/dart2/MapLookup.dart +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// Benchmark for https://github.com/dart-lang/sdk/issues/45908. -// -// Measures the average time needed for a lookup in Maps. - -import 'dart:math'; - -import 'maps.dart'; - -abstract class MapLookupBenchmark { - final String name; - const MapLookupBenchmark(this.name); - - Map get myMap; - - // Returns the number of nanoseconds per call. - double measureFor(Duration duration) { - final map = myMap; - - // Prevent `sw.elapsedMicroseconds` from dominating with maps with a - // small number of elements. - final int batching = max(1000 ~/ map.length, 1); - - int numberOfLookups = 0; - int totalMicroseconds = 0; - - final sw = Stopwatch()..start(); - final durationInMicroseconds = duration.inMicroseconds; - - do { - for (int i = 0; i < batching; i++) { - String? k = '0'; - while (k != null) { - k = map[k]; - } - numberOfLookups += map.length; - } - totalMicroseconds = sw.elapsedMicroseconds; - } while (totalMicroseconds < durationInMicroseconds); - - final int totalNanoseconds = sw.elapsed.inMicroseconds * 1000; - return totalNanoseconds / numberOfLookups; - } - - // Runs warmup phase, runs benchmark and reports result. - void report() { - // Warmup for 100 ms. - measureFor(const Duration(milliseconds: 100)); - - // Run benchmark for 2 seconds. - final double nsPerCall = measureFor(const Duration(seconds: 2)); - - // Report result. - print('$name(RunTimeRaw): $nsPerCall ns.'); - } -} - -class Constant1 extends MapLookupBenchmark { - const Constant1() : super('MapLookup.Constant1'); - - @override - Map get myMap => const1; -} - -class Final1 extends MapLookupBenchmark { - const Final1() : super('MapLookup.Final1'); - - @override - Map get myMap => final1; -} - -class Constant5 extends MapLookupBenchmark { - const Constant5() : super('MapLookup.Constant5'); - - @override - Map get myMap => const5; -} - -class Final5 extends MapLookupBenchmark { - const Final5() : super('MapLookup.Final5'); - - @override - Map get myMap => final5; -} - -class Constant10 extends MapLookupBenchmark { - const Constant10() : super('MapLookup.Constant10'); - - @override - Map get myMap => const10; -} - -class Final10 extends MapLookupBenchmark { - const Final10() : super('MapLookup.Final10'); - - @override - Map get myMap => final10; -} - -class Constant100 extends MapLookupBenchmark { - const Constant100() : super('MapLookup.Constant100'); - - @override - Map get myMap => const100; -} - -class Final100 extends MapLookupBenchmark { - const Final100() : super('MapLookup.Final100'); - - @override - Map get myMap => final100; -} - -void main() { - final benchmarks = [ - () => const Constant1(), - () => const Constant5(), - () => const Constant10(), - () => const Constant100(), - () => const Final1(), - () => const Final5(), - () => const Final10(), - () => const Final100(), - ]; - for (final benchmark in benchmarks) { - benchmark().report(); - } -} diff --git a/benchmarks/MapLookup/dart2/maps.dart b/benchmarks/MapLookup/dart2/maps.dart deleted file mode 100644 index b71e6d9d910..00000000000 --- a/benchmarks/MapLookup/dart2/maps.dart +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -const const1 = {'0': '1'}; - -final final1 = {'0': '1'}; - -const const5 = { - '0': '1', - '1': '2', - '2': '3', - '3': '4', - '4': '5', -}; - -final final5 = { - '0': '1', - '1': '2', - '2': '3', - '3': '4', - '4': '5', -}; - -const const10 = { - '0': '1', - '1': '2', - '2': '3', - '3': '4', - '4': '5', - '5': '6', - '6': '7', - '7': '8', - '8': '9', - '9': '10', -}; - -final final10 = { - '0': '1', - '1': '2', - '2': '3', - '3': '4', - '4': '5', - '5': '6', - '6': '7', - '7': '8', - '8': '9', - '9': '10', -}; - -const const100 = { - '0': '1', - '1': '2', - '2': '3', - '3': '4', - '4': '5', - '5': '6', - '6': '7', - '7': '8', - '8': '9', - '9': '10', - '10': '11', - '11': '12', - '12': '13', - '13': '14', - '14': '15', - '15': '16', - '16': '17', - '17': '18', - '18': '19', - '19': '20', - '20': '21', - '21': '22', - '22': '23', - '23': '24', - '24': '25', - '25': '26', - '26': '27', - '27': '28', - '28': '29', - '29': '30', - '30': '31', - '31': '32', - '32': '33', - '33': '34', - '34': '35', - '35': '36', - '36': '37', - '37': '38', - '38': '39', - '39': '40', - '40': '41', - '41': '42', - '42': '43', - '43': '44', - '44': '45', - '45': '46', - '46': '47', - '47': '48', - '48': '49', - '49': '50', - '50': '51', - '51': '52', - '52': '53', - '53': '54', - '54': '55', - '55': '56', - '56': '57', - '57': '58', - '58': '59', - '59': '60', - '60': '61', - '61': '62', - '62': '63', - '63': '64', - '64': '65', - '65': '66', - '66': '67', - '67': '68', - '68': '69', - '69': '70', - '70': '71', - '71': '72', - '72': '73', - '73': '74', - '74': '75', - '75': '76', - '76': '77', - '77': '78', - '78': '79', - '79': '80', - '80': '81', - '81': '82', - '82': '83', - '83': '84', - '84': '85', - '85': '86', - '86': '87', - '87': '88', - '88': '89', - '89': '90', - '90': '91', - '91': '92', - '92': '93', - '93': '94', - '94': '95', - '95': '96', - '96': '97', - '97': '98', - '98': '99', - '99': '100', -}; - -final final100 = { - '0': '1', - '1': '2', - '2': '3', - '3': '4', - '4': '5', - '5': '6', - '6': '7', - '7': '8', - '8': '9', - '9': '10', - '10': '11', - '11': '12', - '12': '13', - '13': '14', - '14': '15', - '15': '16', - '16': '17', - '17': '18', - '18': '19', - '19': '20', - '20': '21', - '21': '22', - '22': '23', - '23': '24', - '24': '25', - '25': '26', - '26': '27', - '27': '28', - '28': '29', - '29': '30', - '30': '31', - '31': '32', - '32': '33', - '33': '34', - '34': '35', - '35': '36', - '36': '37', - '37': '38', - '38': '39', - '39': '40', - '40': '41', - '41': '42', - '42': '43', - '43': '44', - '44': '45', - '45': '46', - '46': '47', - '47': '48', - '48': '49', - '49': '50', - '50': '51', - '51': '52', - '52': '53', - '53': '54', - '54': '55', - '55': '56', - '56': '57', - '57': '58', - '58': '59', - '59': '60', - '60': '61', - '61': '62', - '62': '63', - '63': '64', - '64': '65', - '65': '66', - '66': '67', - '67': '68', - '68': '69', - '69': '70', - '70': '71', - '71': '72', - '72': '73', - '73': '74', - '74': '75', - '75': '76', - '76': '77', - '77': '78', - '78': '79', - '79': '80', - '80': '81', - '81': '82', - '82': '83', - '83': '84', - '84': '85', - '85': '86', - '86': '87', - '87': '88', - '88': '89', - '89': '90', - '90': '91', - '91': '92', - '92': '93', - '93': '94', - '94': '95', - '95': '96', - '96': '97', - '97': '98', - '98': '99', - '99': '100', -}; diff --git a/benchmarks/NativeCall/dart2/NativeCall.dart b/benchmarks/NativeCall/dart2/NativeCall.dart deleted file mode 100644 index 8e2e0d0b7c1..00000000000 --- a/benchmarks/NativeCall/dart2/NativeCall.dart +++ /dev/null @@ -1,327 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// These micro benchmarks track the speed of native calls. - -// @dart=2.9 - -import 'dart:ffi'; -import 'dart:io'; - -import 'package:benchmark_harness/benchmark_harness.dart'; - -import 'dlopen_helper.dart'; - -// Number of benchmark iterations per function. -const N = 1000; - -// The native library that holds all the native functions being called. -final nativeFunctionsLib = dlopenPlatformSpecific( - 'native_functions', - path: Platform.script.resolve('../native/out/').path, -); - -final getRootLibraryUrl = nativeFunctionsLib - .lookupFunction('GetRootLibraryUrl'); - -final setNativeResolverForTest = nativeFunctionsLib - .lookupFunction( - 'SetNativeResolverForTest', - ); - -// -// Benchmark fixtures. -// - -abstract class NativeCallBenchmarkBase extends BenchmarkBase { - NativeCallBenchmarkBase(String name) : super(name); - - void expectEquals(actual, expected) { - if (actual != expected) { - throw Exception('$name: Unexpected result: $actual, expected $expected'); - } - } - - void expectApprox(actual, expected) { - if (0.999 * expected > actual || actual > 1.001 * expected) { - throw Exception('$name: Unexpected result: $actual, expected $expected'); - } - } - - void expectIdentical(actual, expected) { - if (!identical(actual, expected)) { - throw Exception('$name: Unexpected result: $actual, expected $expected'); - } - } -} - -class Uint8x01 extends NativeCallBenchmarkBase { - Uint8x01() : super('NativeCall.Uint8x01'); - - @pragma('vm:external-name', 'Function1Uint8') - external static int f(int a); - - @override - void run() { - int x = 0; - for (int i = 0; i < N; i++) { - x += f(17); - } - expectEquals(x, N * 17 + N * 42); - } -} - -class Int64x20 extends NativeCallBenchmarkBase { - Int64x20() : super('NativeCall.Int64x20'); - - @pragma('vm:external-name', 'Function20Int64') - external static int f( - int a, - int b, - int c, - int d, - int e, - int f, - int g, - int h, - int i, - int j, - int k, - int l, - int m, - int n, - int o, - int p, - int q, - int r, - int s, - int t, - ); - - @override - void run() { - int x = 0; - for (int i = 0; i < N; i++) { - x += f(i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i); - } - expectEquals(x, N * (N - 1) * 20 / 2); - } -} - -class Doublex01 extends NativeCallBenchmarkBase { - Doublex01() : super('NativeCall.Doublex01'); - - @pragma('vm:external-name', 'Function1Double') - external static double f(double a); - - @override - void run() { - double x = 0.0; - for (int i = 0; i < N; i++) { - x += f(17.0); - } - final double expected = N * (17.0 + 42.0); - expectApprox(x, expected); - } -} - -class Doublex20 extends NativeCallBenchmarkBase { - Doublex20() : super('NativeCall.Doublex20'); - - @pragma('vm:external-name', 'Function20Double') - external static double f( - double a, - double b, - double c, - double d, - double e, - double f, - double g, - double h, - double i, - double j, - double k, - double l, - double m, - double n, - double o, - double p, - double q, - double r, - double s, - double t, - ); - - @override - void run() { - double x = 0; - for (int i = 0; i < N; i++) { - x += f( - 1.0, - 2.0, - 3.0, - 4.0, - 5.0, - 6.0, - 7.0, - 8.0, - 9.0, - 10.0, - 11.0, - 12.0, - 13.0, - 14.0, - 15.0, - 16.0, - 17.0, - 18.0, - 19.0, - 20.0, - ); - } - final double expected = - N * - (1.0 + - 2.0 + - 3.0 + - 4.0 + - 5.0 + - 6.0 + - 7.0 + - 8.0 + - 9.0 + - 10.0 + - 11.0 + - 12.0 + - 13.0 + - 14.0 + - 15.0 + - 16.0 + - 17.0 + - 18.0 + - 19.0 + - 20.0); - expectApprox(x, expected); - } -} - -class MyClass { - int a; - MyClass(this.a); -} - -class Handlex01 extends NativeCallBenchmarkBase { - Handlex01() : super('NativeCall.Handlex01'); - - @pragma('vm:external-name', 'Function1Handle') - external static Object f(Object a); - - @override - void run() { - final p1 = MyClass(123); - Object x = p1; - for (int i = 0; i < N; i++) { - x = f(x); - } - expectIdentical(x, p1); - } -} - -class Handlex20 extends NativeCallBenchmarkBase { - Handlex20() : super('NativeCall.Handlex20'); - - @pragma('vm:external-name', 'Function20Handle') - external static Object f( - Object a, - Object b, - Object c, - Object d, - Object e, - Object f, - Object g, - Object h, - Object i, - Object j, - Object k, - Object l, - Object m, - Object n, - Object o, - Object p, - Object q, - Object r, - Object s, - Object t, - ); - - @override - void run() { - final p1 = MyClass(123); - final p2 = MyClass(2); - final p3 = MyClass(3); - final p4 = MyClass(4); - final p5 = MyClass(5); - final p6 = MyClass(6); - final p7 = MyClass(7); - final p8 = MyClass(8); - final p9 = MyClass(9); - final p10 = MyClass(10); - final p11 = MyClass(11); - final p12 = MyClass(12); - final p13 = MyClass(13); - final p14 = MyClass(14); - final p15 = MyClass(15); - final p16 = MyClass(16); - final p17 = MyClass(17); - final p18 = MyClass(18); - final p19 = MyClass(19); - final p20 = MyClass(20); - Object x = p1; - for (int i = 0; i < N; i++) { - x = f( - x, - p2, - p3, - p4, - p5, - p6, - p7, - p8, - p9, - p10, - p11, - p12, - p13, - p14, - p15, - p16, - p17, - p18, - p19, - p20, - ); - } - expectIdentical(x, p1); - } -} - -// -// Main driver. -// - -void main() { - setNativeResolverForTest(getRootLibraryUrl()); - - final benchmarks = [ - () => Uint8x01(), - () => Int64x20(), - () => Doublex01(), - () => Doublex20(), - () => Handlex01(), - () => Handlex20(), - ]; - for (final benchmark in benchmarks) { - benchmark().report(); - } -} diff --git a/benchmarks/NativeCall/dart2/dlopen_helper.dart b/benchmarks/NativeCall/dart2/dlopen_helper.dart deleted file mode 100644 index e6e3bfa3da2..00000000000 --- a/benchmarks/NativeCall/dart2/dlopen_helper.dart +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:ffi'; -import 'dart:io'; - -const arm = 'arm'; -const arm64 = 'arm64'; -const ia32 = 'ia32'; -const x64 = 'x64'; - -// https://stackoverflow.com/questions/45125516/possible-values-for-uname-m -final _unames = { - 'arm': arm, - 'aarch64_be': arm64, - 'aarch64': arm64, - 'armv8b': arm64, - 'armv8l': arm64, - 'i386': ia32, - 'i686': ia32, - 'x86_64': x64, -}; - -String _checkRunningMode(String architecture) { - // Check if we're running in 32bit mode. - final int pointerSize = sizeOf(); - if (pointerSize == 4 && architecture == x64) return ia32; - if (pointerSize == 4 && architecture == arm64) return arm; - - return architecture; -} - -String _architecture() { - final String uname = Process.runSync('uname', ['-m']).stdout.trim(); - final String architecture = _unames[uname]; - if (architecture == null) { - throw Exception('Unrecognized architecture: "$uname"'); - } - - // Check if we're running in 32bit mode. - return _checkRunningMode(architecture); -} - -String _platformPath(String name, {String path = ''}) { - if (Platform.isMacOS || Platform.isIOS) { - return '${path}mac/${_architecture()}/lib$name.dylib'; - } - - if (Platform.isWindows) { - return '${path}win/${_checkRunningMode(x64)}/$name.dll'; - } - - // Unknown platforms default to Unix implementation. - return '${path}linux/${_architecture()}/lib$name.so'; -} - -DynamicLibrary dlopenPlatformSpecific(String name, {String path}) { - final String fullPath = _platformPath(name, path: path); - return DynamicLibrary.open(fullPath); -} diff --git a/benchmarks/ObjectHash/dart2/ObjectHash.dart b/benchmarks/ObjectHash/dart2/ObjectHash.dart deleted file mode 100644 index 49ac7ae6d2c..00000000000 --- a/benchmarks/ObjectHash/dart2/ObjectHash.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import '../dart/ObjectHash.dart' as benchmark; - -void main() { - benchmark.main(); -} diff --git a/benchmarks/Omnibus/dart2/Omnibus.dart b/benchmarks/Omnibus/dart2/Omnibus.dart deleted file mode 100644 index 3fe59dbe470..00000000000 --- a/benchmarks/Omnibus/dart2/Omnibus.dart +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// @dart=2.10 -// -// A benchmark that contains several other benchmarks. -// -// With no arguments, run all benchmarks once. -// With arguments, run only the specified benchmarks in command-line order. -// -// -N: run benchmarks N times, defaults to once. - -// ignore_for_file: library_prefixes - -import '../../BigIntParsePrint/dart2/BigIntParsePrint.dart' - as lib_BigIntParsePrint; -import '../../ListCopy/dart2/ListCopy.dart' as lib_ListCopy; -import '../../MapCopy/dart2/MapCopy.dart' as lib_MapCopy; -import '../../MD5/dart2/md5.dart' as lib_MD5; -import '../../RuntimeType/dart2/RuntimeType.dart' as lib_RuntimeType; -import '../../SHA1/dart2/sha1.dart' as lib_SHA1; -import '../../SHA256/dart2/sha256.dart' as lib_SHA256; -import '../../SkeletalAnimation/dart2/SkeletalAnimation.dart' - as lib_SkeletalAnimation; -import '../../SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart' - as lib_SkeletalAnimationSIMD; -import '../../TypedDataDuplicate/dart2/TypedDataDuplicate.dart' - as lib_TypedDataDuplicate; -import '../../Utf8Decode/dart2/Utf8Decode.dart' as lib_Utf8Decode; -import '../../Utf8Encode/dart2/Utf8Encode.dart' as lib_Utf8Encode; - -final Map benchmarks = { - 'BigIntParsePrint': lib_BigIntParsePrint.main, - 'ListCopy': lib_ListCopy.main, - 'MapCopy': () => lib_MapCopy.main([]), - 'MD5': lib_MD5.main, - 'RuntimeType': lib_RuntimeType.main, - 'SHA1': lib_SHA1.main, - 'SHA256': lib_SHA256.main, - 'SkeletalAnimation': lib_SkeletalAnimation.main, - 'SkeletalAnimationSIMD': lib_SkeletalAnimationSIMD.main, - 'TypedDataDuplicate': lib_TypedDataDuplicate.main, - 'Utf8Decode': () => lib_Utf8Decode.main([]), - 'Utf8Encode': () => lib_Utf8Encode.main([]), -}; - -void main(List originalArguments) { - final List args = List.of(originalArguments); - - int repeats = 1; - - for (final arg in args.toList()) { - final int count = int.tryParse(arg); - if (count != null && count < 0) { - repeats = 0 - count; - args.remove(arg); - } - } - - List mains = []; - - for (final name in args.toList()) { - final function = benchmarks[name]; - if (function == null) { - print("Unknown benchmark: '$name'"); - } else { - mains.add(function); - args.remove(name); - } - } - if (args.isNotEmpty) return; // We will have printed an error. - - if (mains.isEmpty) mains = benchmarks.values.toList(); - - for (var i = 0; i < repeats; i++) { - for (final function in mains) { - function(); - } - } -} diff --git a/benchmarks/OmnibusDeferred/dart2/OmnibusDeferred.dart b/benchmarks/OmnibusDeferred/dart2/OmnibusDeferred.dart deleted file mode 100644 index 341dec15271..00000000000 --- a/benchmarks/OmnibusDeferred/dart2/OmnibusDeferred.dart +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// @dart=2.10 -// -// A benchmark that contains several other benchmarks. -// -// With no arguments, run all benchmarks once. -// With arguments, run only the specified benchmarks in command-line order. -// -// -N: run benchmarks N times, defaults to once. - -// ignore_for_file: library_prefixes - -import '../../BigIntParsePrint/dart2/BigIntParsePrint.dart' - deferred as lib_BigIntParsePrint; -import '../../ListCopy/dart2/ListCopy.dart' deferred as lib_ListCopy; -import '../../MapCopy/dart/MapCopy.dart' deferred as lib_MapCopy; -import '../../MD5/dart2/md5.dart' deferred as lib_MD5; -import '../../RuntimeType/dart2/RuntimeType.dart' deferred as lib_RuntimeType; -import '../../SHA1/dart2/sha1.dart' deferred as lib_SHA1; -import '../../SHA256/dart2/sha256.dart' deferred as lib_SHA256; -import '../../SkeletalAnimation/dart2/SkeletalAnimation.dart' - deferred as lib_SkeletalAnimation; -import '../../SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart' - deferred as lib_SkeletalAnimationSIMD; -import '../../TypedDataDuplicate/dart2/TypedDataDuplicate.dart' - deferred as lib_TypedDataDuplicate; -import '../../Utf8Decode/dart2/Utf8Decode.dart' deferred as lib_Utf8Decode; -import '../../Utf8Encode/dart2/Utf8Encode.dart' deferred as lib_Utf8Encode; - -class Lib { - final Future Function() load; - final void Function() main; - Lib(this.load, this.main); -} - -final Map benchmarks = { - 'BigIntParsePrint': Lib( - lib_BigIntParsePrint.loadLibrary, - () => lib_BigIntParsePrint.main(), - ), - 'ListCopy': Lib(lib_ListCopy.loadLibrary, () => lib_ListCopy.main()), - 'MapCopy': Lib(lib_MapCopy.loadLibrary, () => lib_MapCopy.main([])), - 'MD5': Lib(lib_MD5.loadLibrary, () => lib_MD5.main()), - 'RuntimeType': Lib(lib_RuntimeType.loadLibrary, () => lib_RuntimeType.main()), - 'SHA1': Lib(lib_SHA1.loadLibrary, () => lib_SHA1.main()), - 'SHA256': Lib(lib_SHA256.loadLibrary, () => lib_SHA256.main()), - 'SkeletalAnimation': Lib( - lib_SkeletalAnimation.loadLibrary, - () => lib_SkeletalAnimation.main(), - ), - 'SkeletalAnimationSIMD': Lib( - lib_SkeletalAnimationSIMD.loadLibrary, - () => lib_SkeletalAnimationSIMD.main(), - ), - 'TypedDataDuplicate': Lib( - lib_TypedDataDuplicate.loadLibrary, - () => lib_TypedDataDuplicate.main(), - ), - 'Utf8Decode': Lib(lib_Utf8Decode.loadLibrary, () => lib_Utf8Decode.main([])), - 'Utf8Encode': Lib(lib_Utf8Encode.loadLibrary, () => lib_Utf8Encode.main([])), -}; - -void main(List originalArguments) async { - final List args = List.of(originalArguments); - - int repeats = 1; - - for (final arg in args.toList()) { - final int count = int.tryParse(arg); - if (count != null && count < 0) { - repeats = 0 - count; - args.remove(arg); - } - } - - final preload = args.remove('--preload'); - - List libs = []; - - for (final name in args.toList()) { - final lib = benchmarks[name]; - if (lib == null) { - print("Unknown benchmark: '$name'"); - } else { - libs.add(lib); - args.remove(name); - } - } - if (args.isNotEmpty) return; // We will have printed an error. - - if (libs.isEmpty) libs = benchmarks.values.toList(); - - if (preload) { - for (final lib in libs) { - await lib.load(); - } - } - - for (var i = 0; i < repeats; i++) { - for (final lib in libs) { - if (!preload) await lib.load(); - lib.main(); - } - } -} diff --git a/benchmarks/Richards/dart2/Richards.dart b/benchmarks/Richards/dart2/Richards.dart deleted file mode 100644 index bf9195ed571..00000000000 --- a/benchmarks/Richards/dart2/Richards.dart +++ /dev/null @@ -1,453 +0,0 @@ -// Copyright 2006-2008 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Ported by the Dart team to Dart. - -// This is a Dart implementation of the Richards benchmark from: -// -// http://www.cl.cam.ac.uk/~mr10/Bench.html -// -// The benchmark was originally implemented in BCPL by -// Martin Richards. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; - -void main() { - const Richards().report(); -} - -/// Richards imulates the task dispatcher of an operating system. -class Richards extends BenchmarkBase { - const Richards() : super('Richards'); - - @override - void run() { - final Scheduler scheduler = Scheduler(); - scheduler.addIdleTask(ID_IDLE, 0, null, COUNT); - - Packet queue = Packet(null, ID_WORKER, KIND_WORK); - queue = Packet(queue, ID_WORKER, KIND_WORK); - scheduler.addWorkerTask(ID_WORKER, 1000, queue); - - queue = Packet(null, ID_DEVICE_A, KIND_DEVICE); - queue = Packet(queue, ID_DEVICE_A, KIND_DEVICE); - queue = Packet(queue, ID_DEVICE_A, KIND_DEVICE); - scheduler.addHandlerTask(ID_HANDLER_A, 2000, queue); - - queue = Packet(null, ID_DEVICE_B, KIND_DEVICE); - queue = Packet(queue, ID_DEVICE_B, KIND_DEVICE); - queue = Packet(queue, ID_DEVICE_B, KIND_DEVICE); - scheduler.addHandlerTask(ID_HANDLER_B, 3000, queue); - - scheduler.addDeviceTask(ID_DEVICE_A, 4000, null); - - scheduler.addDeviceTask(ID_DEVICE_B, 5000, null); - - scheduler.schedule(); - - if (scheduler.queueCount != EXPECTED_QUEUE_COUNT || - scheduler.holdCount != EXPECTED_HOLD_COUNT) { - print( - 'Error during execution: queueCount = ${scheduler.queueCount}' - ', holdCount = ${scheduler.holdCount}.', - ); - } - if (EXPECTED_QUEUE_COUNT != scheduler.queueCount) { - throw 'bad scheduler queue-count'; - } - if (EXPECTED_HOLD_COUNT != scheduler.holdCount) { - throw 'bad scheduler hold-count'; - } - } - - static const int DATA_SIZE = 4; - static const int COUNT = 1000; - - /// These two constants specify how many times a packet is queued and - /// how many times a task is put on hold in a correct run of richards. - /// They don't have any meaning a such but are characteristic of a - /// correct run so if the actual queue or hold count is different from - /// the expected there must be a bug in the implementation. - static const int EXPECTED_QUEUE_COUNT = 2322; - static const int EXPECTED_HOLD_COUNT = 928; - - static const int ID_IDLE = 0; - static const int ID_WORKER = 1; - static const int ID_HANDLER_A = 2; - static const int ID_HANDLER_B = 3; - static const int ID_DEVICE_A = 4; - static const int ID_DEVICE_B = 5; - static const int NUMBER_OF_IDS = 6; - - static const int KIND_DEVICE = 0; - static const int KIND_WORK = 1; -} - -/// A scheduler can be used to schedule a set of tasks based on their relative -/// priorities. Scheduling is done by maintaining a list of task control blocks -/// which holds tasks and the data queue they are processing. -class Scheduler { - int queueCount = 0; - int holdCount = 0; - TaskControlBlock currentTcb; - int currentId; - TaskControlBlock list; - List blocks = List.filled( - Richards.NUMBER_OF_IDS, - null, - ); - - /// Add an idle task to this scheduler. - void addIdleTask(int id, int priority, Packet queue, int count) { - addRunningTask(id, priority, queue, IdleTask(this, 1, count)); - } - - /// Add a work task to this scheduler. - void addWorkerTask(int id, int priority, Packet queue) { - addTask(id, priority, queue, WorkerTask(this, Richards.ID_HANDLER_A, 0)); - } - - /// Add a handler task to this scheduler. - void addHandlerTask(int id, int priority, Packet queue) { - addTask(id, priority, queue, HandlerTask(this)); - } - - /// Add a handler task to this scheduler. - void addDeviceTask(int id, int priority, Packet queue) { - addTask(id, priority, queue, DeviceTask(this)); - } - - /// Add the specified task and mark it as running. - void addRunningTask(int id, int priority, Packet queue, Task task) { - addTask(id, priority, queue, task); - currentTcb.setRunning(); - } - - /// Add the specified task to this scheduler. - void addTask(int id, int priority, Packet queue, Task task) { - currentTcb = TaskControlBlock(list, id, priority, queue, task); - list = currentTcb; - blocks[id] = currentTcb; - } - - /// Execute the tasks managed by this scheduler. - void schedule() { - currentTcb = list; - while (currentTcb != null) { - if (currentTcb.isHeldOrSuspended()) { - currentTcb = currentTcb.link; - } else { - currentId = currentTcb.id; - currentTcb = currentTcb.run(); - } - } - } - - /// Release a task that is currently blocked and return the next block to run. - TaskControlBlock release(int id) { - final TaskControlBlock tcb = blocks[id]; - if (tcb == null) return tcb; - tcb.markAsNotHeld(); - if (tcb.priority > currentTcb.priority) return tcb; - return currentTcb; - } - - /// Block the currently executing task and return the next task control block - /// to run. The blocked task will not be made runnable until it is explicitly - /// released, even if new work is added to it. - TaskControlBlock holdCurrent() { - holdCount++; - currentTcb.markAsHeld(); - return currentTcb.link; - } - - /// Suspend the currently executing task and return the next task - /// control block to run. - /// If new work is added to the suspended task it will be made runnable. - TaskControlBlock suspendCurrent() { - currentTcb.markAsSuspended(); - return currentTcb; - } - - /// Add the specified packet to the end of the worklist used by the task - /// associated with the packet and make the task runnable if it is currently - /// suspended. - TaskControlBlock queue(Packet packet) { - final TaskControlBlock t = blocks[packet.id]; - if (t == null) return t; - queueCount++; - packet.link = null; - packet.id = currentId; - return t.checkPriorityAdd(currentTcb, packet); - } -} - -/// A task control block manages a task and the queue of work packages -/// associated with it. -class TaskControlBlock { - TaskControlBlock link; - int id; // The id of this block. - int priority; // The priority of this block. - Packet queue; // The queue of packages to be processed by the task. - Task task; - int state; - - TaskControlBlock(this.link, this.id, this.priority, this.queue, this.task) { - state = queue == null ? STATE_SUSPENDED : STATE_SUSPENDED_RUNNABLE; - } - - /// The task is running and is currently scheduled. - static const int STATE_RUNNING = 0; - - /// The task has packets left to process. - static const int STATE_RUNNABLE = 1; - - /// The task is not currently running. The task is not blocked as such and may - /// be started by the scheduler. - static const int STATE_SUSPENDED = 2; - - /// The task is blocked and cannot be run until it is explicitly released. - static const int STATE_HELD = 4; - - static const int STATE_SUSPENDED_RUNNABLE = STATE_SUSPENDED | STATE_RUNNABLE; - static const int STATE_NOT_HELD = ~STATE_HELD; - - void setRunning() { - state = STATE_RUNNING; - } - - void markAsNotHeld() { - state = state & STATE_NOT_HELD; - } - - void markAsHeld() { - state = state | STATE_HELD; - } - - bool isHeldOrSuspended() { - return (state & STATE_HELD) != 0 || (state == STATE_SUSPENDED); - } - - void markAsSuspended() { - state = state | STATE_SUSPENDED; - } - - void markAsRunnable() { - state = state | STATE_RUNNABLE; - } - - /// Runs this task, if it is ready to be run, and returns the next - /// task to run. - TaskControlBlock run() { - Packet packet; - if (state == STATE_SUSPENDED_RUNNABLE) { - packet = queue; - queue = packet.link; - state = queue == null ? STATE_RUNNING : STATE_RUNNABLE; - } else { - packet = null; - } - return task.run(packet); - } - - /// Adds a packet to the worklist of this block's task, marks this as - /// runnable if necessary, and returns the next runnable object to run - /// (the one with the highest priority). - TaskControlBlock checkPriorityAdd(TaskControlBlock task, Packet packet) { - if (queue == null) { - queue = packet; - markAsRunnable(); - if (priority > task.priority) return this; - } else { - queue = packet.addTo(queue); - } - return task; - } - - @override - String toString() => 'tcb { $task@$state }'; -} - -/// Abstract task that manipulates work packets. -abstract class Task { - Scheduler scheduler; // The scheduler that manages this task. - - Task(this.scheduler); - - TaskControlBlock run(Packet packet); -} - -/// An idle task doesn't do any work itself but cycles control between the two -/// device tasks. -class IdleTask extends Task { - int v1; // A seed value that controls how the device tasks are scheduled. - int count; // The number of times this task should be scheduled. - - IdleTask(Scheduler scheduler, this.v1, this.count) : super(scheduler); - - @override - TaskControlBlock run(Packet packet) { - count--; - if (count == 0) return scheduler.holdCurrent(); - if ((v1 & 1) == 0) { - v1 = v1 >> 1; - return scheduler.release(Richards.ID_DEVICE_A); - } - v1 = (v1 >> 1) ^ 0xD008; - return scheduler.release(Richards.ID_DEVICE_B); - } - - @override - String toString() => 'IdleTask'; -} - -/// A task that suspends itself after each time it has been run to simulate -/// waiting for data from an external device. -class DeviceTask extends Task { - Packet v1; - - DeviceTask(Scheduler scheduler) : super(scheduler); - - @override - TaskControlBlock run(Packet packet) { - if (packet == null) { - if (v1 == null) return scheduler.suspendCurrent(); - final Packet v = v1; - v1 = null; - return scheduler.queue(v); - } - v1 = packet; - return scheduler.holdCurrent(); - } - - @override - String toString() => 'DeviceTask'; -} - -/// A task that manipulates work packets. -class WorkerTask extends Task { - int v1; // A seed used to specify how work packets are manipulated. - int v2; // Another seed used to specify how work packets are manipulated. - - WorkerTask(Scheduler scheduler, this.v1, this.v2) : super(scheduler); - - @override - TaskControlBlock run(Packet packet) { - if (packet == null) { - return scheduler.suspendCurrent(); - } - if (v1 == Richards.ID_HANDLER_A) { - v1 = Richards.ID_HANDLER_B; - } else { - v1 = Richards.ID_HANDLER_A; - } - packet.id = v1; - packet.a1 = 0; - for (int i = 0; i < Richards.DATA_SIZE; i++) { - v2++; - if (v2 > 26) v2 = 1; - packet.a2[i] = v2; - } - return scheduler.queue(packet); - } - - @override - String toString() => 'WorkerTask'; -} - -/// A task that manipulates work packets and then suspends itself. -class HandlerTask extends Task { - Packet v1; - Packet v2; - - HandlerTask(Scheduler scheduler) : super(scheduler); - - @override - TaskControlBlock run(Packet packet) { - if (packet != null) { - if (packet.kind == Richards.KIND_WORK) { - v1 = packet.addTo(v1); - } else { - v2 = packet.addTo(v2); - } - } - if (v1 != null) { - final int count = v1.a1; - Packet v; - if (count < Richards.DATA_SIZE) { - if (v2 != null) { - v = v2; - v2 = v2.link; - v.a1 = v1.a2[count]; - v1.a1 = count + 1; - return scheduler.queue(v); - } - } else { - v = v1; - v1 = v1.link; - return scheduler.queue(v); - } - } - return scheduler.suspendCurrent(); - } - - @override - String toString() => 'HandlerTask'; -} - -/// A simple package of data that is manipulated by the tasks. The exact layout -/// of the payload data carried by a packet is not important, and neither is -/// the nature of the work performed on packets by the tasks. Besides carrying -/// data, packets form linked lists and are hence used both as data and -/// worklists. -class Packet { - Packet link; // The tail of the linked list of packets. - int id; // An ID for this packet. - int kind; // The type of this packet. - int a1 = 0; - - List a2 = List.filled(Richards.DATA_SIZE, null); - - Packet(this.link, this.id, this.kind); - - /// Add this packet to the end of a worklist, and return the worklist. - Packet addTo(Packet queue) { - link = null; - if (queue == null) return this; - Packet peek, next = queue; - while ((peek = next.link) != null) { - next = peek; - } - next.link = this; - return queue; - } - - @override - String toString() => 'Packet'; -} diff --git a/benchmarks/RuntimeType/dart2/RuntimeType.dart b/benchmarks/RuntimeType/dart2/RuntimeType.dart deleted file mode 100644 index 1da9741419e..00000000000 --- a/benchmarks/RuntimeType/dart2/RuntimeType.dart +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// Benchmark for runtimeType patterns as used in Flutter. - -// ignore_for_file: prefer_const_constructors -// ignore_for_file: avoid_function_literals_in_foreach_calls - -// @dart=2.9 - -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart'; - -abstract class Key { - const factory Key(String value) = ValueKey; - const Key.empty(); -} - -abstract class LocalKey extends Key { - const LocalKey() : super.empty(); -} - -class ValueKey extends LocalKey { - const ValueKey(this.value); - final T value; - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is ValueKey && other.value == value; - } - - @override - int get hashCode => value.hashCode; -} - -abstract class Widget { - const Widget({this.key}); - final Key key; - - @pragma('dart2js:noInline') - static bool canUpdate(Widget oldWidget, Widget newWidget) { - return oldWidget.runtimeType == newWidget.runtimeType && - oldWidget.key == newWidget.key; - } -} - -class AWidget extends Widget { - const AWidget({Key key}) : super(key: key); -} - -class BWidget extends Widget { - const BWidget({Key key}) : super(key: key); -} - -class CWidget extends Widget { - const CWidget({Key key}) : super(key: key); -} - -class DWidget extends Widget { - const DWidget({Key key}) : super(key: key); -} - -class EWidget extends Widget { - const EWidget({Key key}) : super(key: key); -} - -class FWidget extends Widget { - const FWidget({Key key}) : super(key: key); -} - -class WWidget extends Widget { - final W /*?*/ ref; - const WWidget({this.ref, Key key}) : super(key: key); -} - -class WidgetCanUpdateBenchmark extends BenchmarkBase { - WidgetCanUpdateBenchmark() : super('RuntimeType.Widget.canUpdate.byType'); - - // All widgets have different types. - static List _widgets() => [ - AWidget(), - BWidget(), - CWidget(), - DWidget(), - EWidget(), - FWidget(), - WWidget(), - WWidget(ref: const BWidget()), - WWidget(ref: CWidget()), - const WWidget(ref: DWidget()), - ]; - // Bulk up list to reduce loop overheads. - final List widgets = _widgets() + _widgets() + _widgets(); - - @override - void exercise() => run(); - - @override - void run() { - for (var w1 in widgets) { - for (var w2 in widgets) { - if (Widget.canUpdate(w1, w2) != Widget.canUpdate(w2, w1)) { - throw 'Hmm $w1 $w2'; - } - } - } - } - - // Normalize by number of calls to [Widgets.canUpdate]. - @override - double measure() => super.measure() / (widgets.length * widgets.length * 2); -} - -class ValueKeyEqualBenchmark extends BenchmarkBase { - ValueKeyEqualBenchmark() : super('RuntimeType.Widget.canUpdate.byKey'); - - // All widgets the same class but distinguished on keys. - static List _widgets() => [ - AWidget(), - AWidget(key: ValueKey(1)), - AWidget(key: ValueKey(1)), - AWidget(key: ValueKey(2)), - AWidget(key: ValueKey(2)), - AWidget(key: ValueKey(3)), - AWidget(key: ValueKey('one')), - AWidget(key: ValueKey('two')), - AWidget(key: ValueKey('three')), - AWidget(key: ValueKey(Duration(seconds: 5))), - ]; - // Bulk up list to reduce loop overheads. - final List widgets = _widgets() + _widgets() + _widgets(); - - @override - void exercise() => run(); - - @override - void run() { - for (var w1 in widgets) { - for (var w2 in widgets) { - if (Widget.canUpdate(w1, w2) != Widget.canUpdate(w2, w1)) { - throw 'Hmm $w1 $w2'; - } - } - } - } - - // Normalize by number of calls to [Widgets.canUpdate]. - @override - double measure() => super.measure() / (widgets.length * widgets.length * 2); -} - -void pollute() { - // Various bits of code to make environment less unrealistic. - void check(dynamic a, dynamic b) { - if (a.runtimeType != b.runtimeType) throw 'mismatch $a $b'; - } - - check(Uint8List(1), Uint8List(2)); // dart2js needs native interceptors. - check(Int16List(1), Int16List(2)); - check([], []); - check({}, {}); -} - -void main() { - pollute(); - - final benchmarks = [WidgetCanUpdateBenchmark(), ValueKeyEqualBenchmark()]; - - // Warm up all benchmarks before running any. - benchmarks.forEach((bm) => bm.run()); - - benchmarks.forEach((bm) => bm.report()); -} diff --git a/benchmarks/SDKArtifactSizes/dart2/SDKArtifactSizes.dart b/benchmarks/SDKArtifactSizes/dart2/SDKArtifactSizes.dart deleted file mode 100644 index 52f9b106c4a..00000000000 --- a/benchmarks/SDKArtifactSizes/dart2/SDKArtifactSizes.dart +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -// Reports the sizes of binary artifacts shipped with the SDK. - -import 'dart:io'; - -const executables = ['dart', 'dartaotruntime']; - -const libs = [ - 'vm_platform_strong.dill', - 'vm_platform_strong_product.dill', -]; - -const snapshots = [ - 'analysis_server', - 'dart2js', - 'dart2wasm', - 'dartdev', - 'dartdevc', - 'dds_aot', - 'frontend_server', - 'gen_kernel', - 'kernel-service', - 'kernel_worker', -]; - -const resources = ['devtools']; - -void reportFileSize(String path, String name) { - try { - final size = File(path).lengthSync(); - print('SDKArtifactSizes.$name(CodeSize): $size'); - } on FileSystemException { - // Report dummy data for artifacts that don't exist for specific platforms. - print('SDKArtifactSizes.$name(CodeSize): 0'); - } -} - -void reportDirectorySize(String path, String name) async { - final dir = Directory(path); - - try { - final size = dir - .listSync(recursive: true, followLinks: false) - .whereType() - .map((file) => file.lengthSync()) - .fold(0, (a, b) => a + b); - print('SDKArtifactSizes.$name(CodeSize): $size'); - } on FileSystemException { - // Report dummy data on errors. - print('SDKArtifactSizes.$name(CodeSize): 0'); - } -} - -void main() { - final topDirIndex = Platform.resolvedExecutable.lastIndexOf( - Platform.pathSeparator, - ); - final rootDir = Platform.resolvedExecutable.substring(0, topDirIndex); - - for (final executable in executables) { - final executablePath = '$rootDir/dart-sdk/bin/$executable'; - reportFileSize(executablePath, executable); - } - - for (final lib in libs) { - final libPath = '$rootDir/dart-sdk/lib/_internal/$lib'; - reportFileSize(libPath, lib); - } - - for (final snapshot in snapshots) { - final snapshotPath = - '$rootDir/dart-sdk/bin/snapshots/$snapshot.dart.snapshot'; - reportFileSize(snapshotPath, snapshot); - } - - for (final resource in resources) { - final resourcePath = '$rootDir/dart-sdk/bin/resources/$resource'; - reportDirectorySize(resourcePath, resource); - } - - // Measure the sdk size. - reportDirectorySize('$rootDir/dart-sdk', 'sdk'); -} diff --git a/benchmarks/SHA1/dart2/sha1.dart b/benchmarks/SHA1/dart2/sha1.dart deleted file mode 100644 index 24ffef63712..00000000000 --- a/benchmarks/SHA1/dart2/sha1.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; -import 'package:convert/convert.dart'; -import 'package:crypto/crypto.dart'; - -const size = 8 * 1024; -const expected = 'ecca46e1a1d0a6012713b09a870d84f695b6d9b0'; - -class SHA1Bench extends BenchmarkBase { - List data; - - SHA1Bench() : super('SHA1') { - data = List.filled(size, null); - for (int i = 0; i < data.length; i++) { - data[i] = i % 256; - } - } - - @override - void run() { - final hash = sha1.convert(data); - if (hex.encode(hash.bytes) != expected) { - throw 'Incorrect HASH computed.'; - } - } -} - -void main() { - SHA1Bench().report(); -} diff --git a/benchmarks/SHA256/dart2/sha256.dart b/benchmarks/SHA256/dart2/sha256.dart deleted file mode 100644 index 9be21a94bd7..00000000000 --- a/benchmarks/SHA256/dart2/sha256.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'package:benchmark_harness/benchmark_harness.dart'; -import 'package:convert/convert.dart'; -import 'package:crypto/crypto.dart'; - -const size = 8 * 1024; -const expected = - 'dc404a613fedaeb54034514bc6505f56b933caa5250299ba7d094377a51caa46'; - -class SHA256Bench extends BenchmarkBase { - List data; - - SHA256Bench() : super('SHA256') { - data = List.filled(size, null); - for (int i = 0; i < data.length; i++) { - data[i] = i % 256; - } - } - - @override - void run() { - final hash = sha256.convert(data); - if (hex.encode(hash.bytes) != expected) { - throw 'Incorrect HASH computed.'; - } - } -} - -void main() { - SHA256Bench().report(); -} diff --git a/benchmarks/SendPort/dart2/SendPort.dart b/benchmarks/SendPort/dart2/SendPort.dart deleted file mode 100644 index 459b608a693..00000000000 --- a/benchmarks/SendPort/dart2/SendPort.dart +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:async'; -import 'dart:convert'; -import 'dart:isolate'; - -// (Same data as used in our other Json* benchmarks) -final data = - '{"summary":{"turnover":0.3736,"correlation2":0.' - '7147,"concentration":0.3652,"beta":0.8814,"totalValue":1.3' - '091078259E8,"correlation":0.7217},"watchlist":[],"shortCash' - '":-1611000,"holdings":[{"type":"LONG","commission":1040' - ',"cost":9001920,"quantity":26000,"lots":[{"marketCap":"' - 'L","industry":"TECHNOLOGY","style":"G","buyDate":"20' - '08-10-08 13:44:20.000","quantity":8000},{"marketCap":"L",' - '"industry":"TECHNOLOGY","style":"G","buyDate":"2008-1' - '0-15 13:28:02.000","quantity":18000}],"stock":"GOOG"},{"' - 'type":"LONG","commission":8000,"cost":4672000,"quantity' - '":200000,"lots":[{"marketCap":"L","industry":"TECHNOLO' - 'GY","style":"G","buyDate":"2008-10-15 13:28:54.000","q' - 'uantity":200000}],"stock":"MSFT"},{"type":"LONG","comm' - 'ission":21877,"cost":1.001592313E7,"quantity":546919,"lots' - '":[{"marketCap":"L","industry":"FINANCIAL","style":"' - 'G","buyDate":"2008-08-01 09:50:17.000","quantity":103092}' - ',{"marketCap":"L","industry":"FINANCIAL","style":"G"' - ',"buyDate":"2008-08-18 10:31:34.000","quantity":49950},{"' - 'marketCap":"L","industry":"FINANCIAL","style":"G","b' - 'uyDate":"2008-08-29 09:35:22.000","quantity":45045},{"mark' - 'etCap":"L","industry":"FINANCIAL","style":"G","buyDa' - 'te":"2008-09-15 09:40:32.000","quantity":48400},{"marketCa' - 'p":"L","industry":"FINANCIAL","style":"G","buyDate"' - ':"2008-10-06 11:21:50.000","quantity":432},{"marketCap":"' - 'L","industry":"FINANCIAL","style":"G","buyDate":"200' - '8-10-15 13:30:05.000","quantity":300000}],"stock":"UBS"},' - '{"type":"LONG","commission":4000,"cost":6604849.1,"quan' - 'tity":122741,"lots":[{"marketCap":"L","industry":"SERV' - 'ICES","style":"V","buyDate":"2008-04-26 04:44:34.000",' - '"quantity":22741},{"marketCap":"L","industry":"SERVICES' - '","style":"V","buyDate":"2008-10-15 13:31:02.000","qua' - 'ntity":100000}],"stock":"V"},{"type":"LONG","commissio' - 'n":2805,"cost":5005558.25,"quantity":70121,"lots":[{"mar' - 'ketCap":"M","industry":"RETAIL","style":"G","buyDate' - '":"2008-10-10 10:48:36.000","quantity":121},{"marketCap":' - '"M","industry":"RETAIL","style":"G","buyDate":"2008' - '-10-15 13:33:44.000","quantity":70000}],"stock":"LDG"},{' - '"type":"LONG","commission":10000,"cost":5382500,"quanti' - 'ty":250000,"lots":[{"marketCap":"L","industry":"RETAIL' - '","style":"V","buyDate":"2008-10-15 13:34:30.000","qua' - 'ntity":250000}],"stock":"SWY"},{"type":"LONG","commiss' - 'ion":1120,"cost":1240960,"quantity":28000,"lots":[{"mark' - 'etCap":"u","industry":"ETF","style":"B","buyDate":' - '"2008-10-15 15:57:39.000","quantity":28000}],"stock":"OIL' - '"},{"type":"LONG","commission":400,"cost":236800,"quan' - 'tity":10000,"lots":[{"marketCap":"M","industry":"UTILI' - 'TIES_AND_ENERGY","style":"G","buyDate":"2008-10-15 15:58' - ':03.000","quantity":10000}],"stock":"COG"},{"type":"LO' - 'NG","commission":3200,"cost":1369600,"quantity":80000,"l' - 'ots":[{"marketCap":"S","industry":"UTILITIES_AND_ENERGY' - '","style":"G","buyDate":"2008-10-15 15:58:32.000","qua' - 'ntity":80000}],"stock":"CRZO"},{"type":"LONG","commiss' - 'ion":429,"cost":108164.8,"quantity":10720,"lots":[{"mark' - 'etCap":"u","industry":"FINANCIAL","style":"V","buyDa' - 'te":"2008-10-16 09:37:06.000","quantity":10720}],"stock":' - '"FGI"},{"type":"LONG","commission":1080,"cost":494910,' - '"quantity":27000,"lots":[{"marketCap":"L","industry":' - '"RETAIL","style":"V","buyDate":"2008-10-16 09:37:06.000' - '","quantity":27000}],"stock":"LOW"},{"type":"LONG","' - 'commission":4080,"cost":4867440,"quantity":102000,"lots":' - '[{"marketCap":"L","industry":"HEALTHCARE","style":"V' - '","buyDate":"2008-10-16 09:37:06.000","quantity":102000}]' - ',"stock":"AMGN"},{"type":"SHORT","commission":4000,"' - 'cost":-1159000,"quantity":-100000,"lots":[{"marketCap":' - '"L","industry":"TECHNOLOGY","style":"V","buyDate":' - '"2008-10-16 09:37:06.000","quantity":-100000}],"stock":"' - 'AMAT"},{"type":"LONG","commission":2,"cost":5640002,"' - 'quantity":50,"lots":[{"marketCap":"L","industry":"FIN' - 'ANCIAL","style":"B","buyDate":"2008-10-16 09:37:06.000' - '","quantity":50}],"stock":"BRKA"},{"type":"SHORT","' - 'commission":4000,"cost":-436000,"quantity":-100000,"lots' - '":[{"marketCap":"M","industry":"TRANSPORTATION","styl' - 'e":"G","buyDate":"2008-10-16 09:37:06.000","quantity":-' - '100000}],"stock":"JBLU"},{"type":"LONG","commission":8' - '000,"cost":1.1534E7,"quantity":200000,"lots":[{"marketCap' - '":"S","industry":"FINANCIAL","style":"G","buyDate":' - '"2008-10-16 14:35:24.000","quantity":200000}],"stock":"US' - 'O"},{"type":"LONG","commission":4000,"cost":1.0129E7,"' - 'quantity":100000,"lots":[{"marketCap":"L","industry":"' - 'TECHNOLOGY","style":"G","buyDate":"2008-10-15 13:28:26.0' - '00","quantity":50000},{"marketCap":"L","industry":"TEC' - 'HNOLOGY","style":"G","buyDate":"2008-10-17 09:33:09.000' - '","quantity":50000}],"stock":"AAPL"},{"type":"LONG",' - '"commission":1868,"cost":9971367.2,"quantity":54280,"lots' - '":[{"marketCap":"L","industry":"SERVICES","style":"G' - '","buyDate":"2008-04-26 04:44:34.000","quantity":7580},{' - '"marketCap":"L","industry":"SERVICES","style":"G","' - 'buyDate":"2008-05-29 09:50:28.000","quantity":7500},{"mark' - 'etCap":"L","industry":"SERVICES","style":"G","buyDat' - 'e":"2008-10-15 13:30:38.000","quantity":33000},{"marketCap' - '":"L","industry":"SERVICES","style":"G","buyDate":' - '"2008-10-17 09:33:09.000","quantity":6200}],"stock":"MA"' - '}],"longCash":4.600368106E7,"ownerId":8,"pendingOrders":[{' - '"total":487000,"type":"cover","subtotal":483000,"price' - '":4.83,"commission":4000,"date":"2008-10-17 23:56:06.000"' - ',"quantity":100000,"expires":"2008-10-20 16:00:00.000","s' - 'tock":"JBLU","id":182375},{"total":6271600,"type":"buy' - '","subtotal":6270000,"price":156.75,"commission":1600,"d' - 'ate":"2008-10-17 23:56:40.000","quantity":40000,"expires"' - ':"2008-10-20 16:00:00.000","stock":"MA","id":182376}],"' - 'inceptionDate":"2008-04-26 04:44:29.000","withdrawals":0,"' - 'id":219948,"deposits":0}'; - -class SendPortBenchmark { - final BenchmarkConfig config; - ReceivePort port; - StreamIterator it; - - double usPerSend = 0.0; - double usPerReceive = 0.0; - - SendPortBenchmark(this.config); - - // Runs warmup phase, runs benchmark and reports result. - Future report() async { - port = ReceivePort(); - it = StreamIterator(port); - - // Warmup for 100 ms. - await measureFor(const Duration(milliseconds: 200)); - - // Run benchmark for 2 seconds. - // - // Sets [usPerSend] and [usPerReceive] as side-effect. - await measureFor(const Duration(seconds: 2)); - - // Report result. - print('SendPort.Send.${config.name}(RunTimeRaw): $usPerSend us.'); - print('SendPort.Receive.${config.name}(RunTimeRaw): $usPerReceive us.'); - - await it.cancel(); - port.close(); - } - - Future measureFor(Duration duration) async { - final durationInMicroseconds = duration.inMicroseconds; - - int sumSendUs = 0; - int sumReceiveUs = 0; - - final sw = Stopwatch()..start(); - - int numberOfSendReceives = 0; - int lastUs = 0; - int currentUs = 0; - do { - // Send & measure time - port.sendPort.send(config.data); - currentUs = sw.elapsedMicroseconds; - sumSendUs += currentUs - lastUs; - lastUs = currentUs; - - // Receive & measure time - await it.moveNext(); - it.current; - currentUs = sw.elapsedMicroseconds; - sumReceiveUs += currentUs - lastUs; - lastUs = currentUs; - - numberOfSendReceives++; - } while (lastUs < durationInMicroseconds); - - usPerSend = sumSendUs / numberOfSendReceives; - usPerReceive = sumReceiveUs / numberOfSendReceives; - } -} - -class TreeNode { - @pragma('vm:entry-point') // Prevent tree shaking of this field. - final TreeNode left; - @pragma('vm:entry-point') // Prevent tree shaking of this field. - final TreeNode right; - @pragma('vm:entry-point') // Prevent tree shaking of this field. - final int value; - - TreeNode(this.left, this.right, this.value); -} - -TreeNode generateBinaryTreeOfDepth(int depth) { - int i = 0; - - TreeNode gen(int depth) { - if (depth == 0) return TreeNode(null, null, i++); - return TreeNode(gen(depth - 1), gen(depth - 1), i++); - } - - return gen(depth); -} - -class BenchmarkConfig { - final String name; - final dynamic data; - - BenchmarkConfig(this.name, this.data); -} - -Future main(args) async { - final String json5KB = data; - final json5KBDecoded = json.decode(json5KB); - assert(json5KB.length == 5534); - - final json400B = json.encode(json5KBDecoded['pendingOrders']); - final json400BDecoded = json.decode(json400B); - assert(json400B.length == 390); - - final String json50KB = json.encode({ - '1': [json5KBDecoded, json5KBDecoded, json5KBDecoded, json5KBDecoded], - '2': [json5KBDecoded, json5KBDecoded, json5KBDecoded, json5KBDecoded], - '3': json5KBDecoded, - }); - final json50KBDecoded = json.decode(json50KB); - assert(json50KB.length == 49814); - - final String json500KB = json.encode({ - '1': [json50KBDecoded, json50KBDecoded, json50KBDecoded, json50KBDecoded], - '2': [json50KBDecoded, json50KBDecoded, json50KBDecoded, json50KBDecoded], - '3': [json50KBDecoded, json50KBDecoded], - }); - final json500KBDecoded = json.decode(json500KB); - assert(json500KB.length == 498169); - - final String json5MB = json.encode({ - '1': [json500KBDecoded, json500KBDecoded, json500KBDecoded], - '2': [json500KBDecoded, json500KBDecoded, json500KBDecoded], - '3': [json500KBDecoded, json500KBDecoded, json500KBDecoded], - '4': json500KBDecoded, - }); - final json5MBDecoded = json.decode(json5MB); - assert(json5MB.length == 4981723); - - final configs = [ - BenchmarkConfig('Nop', 1), - BenchmarkConfig('Json.400B', json400BDecoded), - BenchmarkConfig('Json.5KB', json5KBDecoded), - BenchmarkConfig('Json.50KB', json50KBDecoded), - BenchmarkConfig('Json.500KB', json500KBDecoded), - BenchmarkConfig('Json.5MB', json5MBDecoded), - BenchmarkConfig('BinaryTree.2', generateBinaryTreeOfDepth(2)), - BenchmarkConfig('BinaryTree.4', generateBinaryTreeOfDepth(4)), - BenchmarkConfig('BinaryTree.6', generateBinaryTreeOfDepth(6)), - BenchmarkConfig('BinaryTree.8', generateBinaryTreeOfDepth(8)), - BenchmarkConfig('BinaryTree.10', generateBinaryTreeOfDepth(10)), - BenchmarkConfig('BinaryTree.12', generateBinaryTreeOfDepth(12)), - BenchmarkConfig('BinaryTree.14', generateBinaryTreeOfDepth(14)), - ]; - - for (final config in configs) { - await SendPortBenchmark(config).report(); - } -} diff --git a/benchmarks/SkeletalAnimation/dart2/SkeletalAnimation.dart b/benchmarks/SkeletalAnimation/dart2/SkeletalAnimation.dart deleted file mode 100644 index 878993c975e..00000000000 --- a/benchmarks/SkeletalAnimation/dart2/SkeletalAnimation.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -/// A Dart implementation of two computation kernels used for skeletal -/// animation. - -// @dart=2.9 - -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart'; -import 'package:vector_math/vector_math_operations.dart'; - -void main() { - SkeletalAnimation().report(); -} - -class SkeletalAnimation extends BenchmarkBase { - SkeletalAnimation() : super('SkeletalAnimation'); - - final Float32List A = Float32List(16); - final Float32List B = Float32List(16); - final Float32List C = Float32List(16); - final Float32List D = Float32List(4); - final Float32List E = Float32List(4); - - @override - void run() { - for (int i = 0; i < 100; i++) { - Matrix44Operations.multiply(C, 0, A, 0, B, 0); - Matrix44Operations.transform4(E, 0, A, 0, D, 0); - } - } -} diff --git a/benchmarks/SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart b/benchmarks/SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart deleted file mode 100644 index 5cf3f4276b8..00000000000 --- a/benchmarks/SkeletalAnimationSIMD/dart2/SkeletalAnimationSIMD.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -/// A Dart implementation of two computation kernels used for skeletal -/// animation. SIMD version. - -// @dart=2.9 - -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart'; -import 'package:vector_math/vector_math_operations.dart'; - -void main() { - SkeletalAnimationSIMD().report(); -} - -class SkeletalAnimationSIMD extends BenchmarkBase { - SkeletalAnimationSIMD() : super('SkeletalAnimationSIMD'); - - final Float32x4List A = Float32x4List(4); - final Float32x4List B = Float32x4List(4); - final Float32x4List C = Float32x4List(4); - final Float32x4List D = Float32x4List(1); - final Float32x4List E = Float32x4List(1); - - @override - void run() { - for (int i = 0; i < 100; i++) { - Matrix44SIMDOperations.multiply(C, 0, A, 0, B, 0); - Matrix44SIMDOperations.transform4(E, 0, A, 0, D, 0); - } - } -} diff --git a/benchmarks/SoundSplayTreeSieve/dart2/README.md b/benchmarks/SoundSplayTreeSieve/dart2/README.md deleted file mode 100644 index d60a944edc5..00000000000 --- a/benchmarks/SoundSplayTreeSieve/dart2/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# SoundSplayTreeSieve -The SoundSplayTreeSieve benchmark reports the runtime of the `sieve9` Golem benchmark -for a `SplayTreeSet` from `dart:collection` and a `SoundSplayTreeSet` that -declares variance modifiers for its type parameters. - -## Running the benchmark -These are instructions for running the benchmark, assuming you are in the `sdk` -directory. - -These benchmarks print a result similar to this (with varying runtimes): -``` -CollectionSieves-SplayTreeSet-removeLoop(RunTime): 4307.52688172043 us. -CollectionSieves-SoundSplayTreeSet-removeLoop(RunTime): 4344.902386117137 us. -``` - -**Dart2JS** -``` -$ sdk/bin/dart2js_developer benchmarks/SoundSplayTreeSieve/dart/SoundSplayTreeSieve.dart --enable-experiment=variance --out=soundsplay_d2js.js -$ third_party/d8/linux/d8 soundsplay_d2js.js -``` - -**Dart2JS (Omit implicit checks)** -``` -$ sdk/bin/dart2js_developer benchmarks/SoundSplayTreeSieve/dart/SoundSplayTreeSieve.dart --enable-experiment=variance --omit-implicit-checks --out=soundsplay_d2js_omit.js --lax-runtime-type-to-string -$ third_party/d8/linux/d8 soundsplay_d2js_omit.js -``` - -**DDK** -``` -$ pkg/dev_compiler/tool/ddb -d -r chrome --enable-experiment=variance -k benchmarks/SoundSplayTreeSieve/dart/SoundSplayTreeSieve.dart -``` diff --git a/benchmarks/SoundSplayTreeSieve/dart2/SoundSplayTreeSieve.dart b/benchmarks/SoundSplayTreeSieve/dart2/SoundSplayTreeSieve.dart deleted file mode 100644 index 87578d154e7..00000000000 --- a/benchmarks/SoundSplayTreeSieve/dart2/SoundSplayTreeSieve.dart +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:collection'; -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart'; -import 'sound_splay_tree.dart'; - -List sieve(List initialCandidates) { - final candidates = SplayTreeSet.from(initialCandidates); - final int last = candidates.last; - final primes = []; - // ignore: literal_only_boolean_expressions - while (true) { - final int prime = candidates.first; - if (prime * prime > last) break; - primes.add(prime); - for (int i = prime; i <= last; i += prime) { - candidates.remove(i); - } - } - return primes..addAll(candidates); -} - -List sieveSound(List initialCandidates) { - final candidates = SoundSplayTreeSet.from(initialCandidates); - final int last = candidates.last; - final primes = []; - // ignore: literal_only_boolean_expressions - while (true) { - final int prime = candidates.first; - if (prime * prime > last) break; - primes.add(prime); - for (int i = prime; i <= last; i += prime) { - candidates.remove(i); - } - } - return primes..addAll(candidates); -} - -/// Returns a list of integers from [first] to [last], both inclusive. -List range(int first, int last) { - return List.generate(last - first + 1, (int i) => i + first); -} - -int id(int x) => x; -int add1(int i) => 1 + i; -bool isEven(int i) => i.isEven; -void exercise(Iterable hello) { - if (hello.toList().length != 5) throw 'x1'; - if (List.from(hello).length != 5) throw 'x1'; - if (Set.from(hello).length != 4) throw 'x1'; - if (List.from(hello).where(isEven).length != 3) throw 'x1'; - if (hello.where(isEven).length != 3) throw 'x1'; - if (hello.map(add1).where(isEven).length != 2) throw 'x1'; - if (hello.where(isEven).map(add1).length != 3) throw 'x1'; -} - -void busyWork() { - // A lot of busy-work calling map/where/toList/List.from to ensure the core - // library is used with some degree of polymorphism. - final L1 = 'hello'.codeUnits; - final L2 = Uint16List(5)..setRange(0, 5, L1); - final L3 = Uint32List(5)..setRange(0, 5, L1); - exercise(L1); - exercise(L2); - exercise(L3); - exercise(UnmodifiableListView(L1)); - exercise(UnmodifiableListView(L2)); - exercise(UnmodifiableListView(L3)); - exercise(L1.asMap().values); - exercise(L1.toList().asMap().values); - final M1 = Map.fromIterables([ - 'a', - 'b', - 'c', - 'd', - 'e', - ], L1); - final M2 = const { - 'a': 104, - 'b': 101, - 'c': 108, - 'd': 108, - 'e': 111, - }; - exercise(M1.values); - exercise(M2.values); -} - -main() { - final benchmarks = [ - Base(sieve, 'CollectionSieves-SplayTreeSet-removeLoop'), - Base(sieveSound, 'CollectionSieves-SoundSplayTreeSet-removeLoop'), - ]; - for (int i = 0; i < 10; i++) { - busyWork(); - for (var bm in benchmarks) { - bm.run(); - } - } - for (var bm in benchmarks) { - bm.report(); - } -} - -class Base extends BenchmarkBase { - final algorithm; - Base(this.algorithm, String name) : super(name); - static final input = range(2, 5000); - void run() { - final primes = algorithm(input); - if (primes.length != 669) throw 'Wrong result for $name: ${primes.length}'; - } -} diff --git a/benchmarks/SoundSplayTreeSieve/dart2/iterable.dart b/benchmarks/SoundSplayTreeSieve/dart2/iterable.dart deleted file mode 100644 index 9900f029988..00000000000 --- a/benchmarks/SoundSplayTreeSieve/dart2/iterable.dart +++ /dev/null @@ -1,26 +0,0 @@ -/// Marker interface for [Iterable] subclasses that have an efficient -/// [length] implementation. - -// @dart=2.9 - -abstract class EfficientLengthIterable extends Iterable { - const EfficientLengthIterable(); - - /// Returns the number of elements in the iterable. - /// - /// This is an efficient operation that doesn't require iterating through - /// the elements. - int get length; -} - -/// Creates errors throw by [Iterable] when the element count is wrong. -abstract class IterableElementError { - /// Error thrown by, e.g., [Iterable.first] when there is no result. - static StateError noElement() => StateError("No element"); - - /// Error thrown by, e.g., [Iterable.single] if there are too many results. - static StateError tooMany() => StateError("Too many elements"); - - /// Error thrown by, e.g., [List.setRange] if there are too few elements. - static StateError tooFew() => StateError("Too few elements"); -} diff --git a/benchmarks/SoundSplayTreeSieve/dart2/sound_splay_tree.dart b/benchmarks/SoundSplayTreeSieve/dart2/sound_splay_tree.dart deleted file mode 100644 index 768582c548d..00000000000 --- a/benchmarks/SoundSplayTreeSieve/dart2/sound_splay_tree.dart +++ /dev/null @@ -1,884 +0,0 @@ -// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:collection'; -import 'iterable.dart'; - -typedef _Predicate = bool Function(T value); - -/// A node in a splay tree. It holds the sorting key and the left -/// and right children in the tree. -class _SoundSplayTreeNode { - final K key; - _SoundSplayTreeNode left; - _SoundSplayTreeNode right; - - _SoundSplayTreeNode(this.key); -} - -/// A node in a splay tree based map. -/// -/// A [_SoundSplayTreeNode] that also contains a value -class _SoundSplayTreeMapNode extends _SoundSplayTreeNode { - V value; - _SoundSplayTreeMapNode(K key, this.value) : super(key); -} - -/// A splay tree is a self-balancing binary search tree. -/// -/// It has the additional property that recently accessed elements -/// are quick to access again. -/// It performs basic operations such as insertion, look-up and -/// removal, in O(log(n)) amortized time. -/// TODO(kallentu): Add a variance modifier to the Node type parameter. -abstract class _SoundSplayTree> { - // The root node of the splay tree. It will contain either the last - // element inserted or the last element looked up. - Node get _root; - set _root(Node newValue); - - // The dummy node used when performing a splay on the tree. Reusing it - // avoids allocating a node each time a splay is performed. - Node get _dummy; - - // Number of elements in the splay tree. - int _count = 0; - - /// Counter incremented whenever the keys in the map changes. - /// - /// Used to detect concurrent modifications. - int _modificationCount = 0; - - /// Counter incremented whenever the tree structure changes. - /// - /// Used to detect that an in-place traversal cannot use - /// cached information that relies on the tree structure. - int _splayCount = 0; - - /// The comparator that is used for this splay tree. - Comparator get _comparator; - - /// The predicate to determine that a given object is a valid key. - _Predicate get _validKey; - - /// Comparison used to compare keys. - int _compare(K key1, K key2); - - /// Perform the splay operation for the given key. Moves the node with - /// the given key to the top of the tree. If no node has the given - /// key, the last node on the search path is moved to the top of the - /// tree. This is the simplified top-down splaying algorithm from: - /// "Self-adjusting Binary Search Trees" by Sleator and Tarjan. - /// - /// Returns the result of comparing the new root of the tree to [key]. - /// Returns -1 if the table is empty. - int _splay(K key) { - if (_root == null) return -1; - - // The right child of the dummy node will hold - // the L tree of the algorithm. The left child of the dummy node - // will hold the R tree of the algorithm. Using a dummy node, left - // and right will always be nodes and we avoid special cases. - Node left = _dummy; - Node right = _dummy; - Node current = _root; - int comp; - while (true) { - comp = _compare(current.key, key); - if (comp > 0) { - if (current.left == null) break; - comp = _compare(current.left.key, key); - if (comp > 0) { - // Rotate right. - _SoundSplayTreeNode tmp = current.left; - current.left = tmp.right; - tmp.right = current; - current = tmp; - if (current.left == null) break; - } - // Link right. - right.left = current; - right = current; - current = current.left; - } else if (comp < 0) { - if (current.right == null) break; - comp = _compare(current.right.key, key); - if (comp < 0) { - // Rotate left. - Node tmp = current.right; - current.right = tmp.left; - tmp.left = current; - current = tmp; - if (current.right == null) break; - } - // Link left. - left.right = current; - left = current; - current = current.right; - } else { - break; - } - } - // Assemble. - left.right = current.left; - right.left = current.right; - current.left = _dummy.right; - current.right = _dummy.left; - _root = current; - - _dummy.right = null; - _dummy.left = null; - _splayCount++; - return comp; - } - - // Emulates splaying with a key that is smaller than any in the subtree - // anchored at [node]. - // and that node is returned. It should replace the reference to [node] - // in any parent tree or root pointer. - Node _splayMin(Node node) { - Node current = node; - while (current.left != null) { - Node left = current.left; - current.left = left.right; - left.right = current; - current = left; - } - return current; - } - - // Emulates splaying with a key that is greater than any in the subtree - // anchored at [node]. - // After this, the largest element in the tree is the root of the subtree, - // and that node is returned. It should replace the reference to [node] - // in any parent tree or root pointer. - Node _splayMax(Node node) { - Node current = node; - while (current.right != null) { - Node right = current.right; - current.right = right.left; - right.left = current; - current = right; - } - return current; - } - - Node _remove(K key) { - if (_root == null) return null; - int comp = _splay(key); - if (comp != 0) return null; - Node result = _root; - _count--; - // assert(_count >= 0); - if (_root.left == null) { - _root = _root.right; - } else { - Node right = _root.right; - // Splay to make sure that the new root has an empty right child. - _root = _splayMax(_root.left); - // Insert the original right child as the right child of the new - // root. - _root.right = right; - } - _modificationCount++; - return result; - } - - /// Adds a new root node with the given [key] or [value]. - /// - /// The [comp] value is the result of comparing the existing root's key - /// with key. - void _addNewRoot(Node node, int comp) { - _count++; - _modificationCount++; - if (_root == null) { - _root = node; - return; - } - // assert(_count >= 0); - if (comp < 0) { - node.left = _root; - node.right = _root.right; - _root.right = null; - } else { - node.right = _root; - node.left = _root.left; - _root.left = null; - } - _root = node; - } - - Node get _first { - if (_root == null) return null; - _root = _splayMin(_root); - return _root; - } - - Node get _last { - if (_root == null) return null; - _root = _splayMax(_root); - return _root; - } - - void _clear() { - _root = null; - _count = 0; - _modificationCount++; - } -} - -class _TypeTest { - bool test(v) => v is T; -} - -int _dynamicCompare(dynamic a, dynamic b) => Comparable.compare(a, b); - -Comparator _defaultCompare() { - // If K <: Comparable, then we can just use Comparable.compare - // with no casts. - Object compare = Comparable.compare; - if (compare is Comparator) { - return compare; - } - // Otherwise wrap and cast the arguments on each call. - return _dynamicCompare; -} - -/// A [Map] of objects that can be ordered relative to each other. -/// -/// The map is based on a self-balancing binary tree. It allows most operations -/// in amortized logarithmic time. -/// -/// Keys of the map are compared using the `compare` function passed in -/// the constructor, both for ordering and for equality. -/// If the map contains only the key `a`, then `map.containsKey(b)` -/// will return `true` if and only if `compare(a, b) == 0`, -/// and the value of `a == b` is not even checked. -/// If the compare function is omitted, the objects are assumed to be -/// [Comparable], and are compared using their [Comparable.compareTo] method. -/// Non-comparable objects (including `null`) will not work as keys -/// in that case. -/// -/// To allow calling [operator []], [remove] or [containsKey] with objects -/// that are not supported by the `compare` function, an extra `isValidKey` -/// predicate function can be supplied. This function is tested before -/// using the `compare` function on an argument value that may not be a [K] -/// value. If omitted, the `isValidKey` function defaults to testing if the -/// value is a [K]. -class SoundSplayTreeMap extends _SoundSplayTree> - with MapMixin { - _SoundSplayTreeMapNode _root; - final _SoundSplayTreeMapNode _dummy = _SoundSplayTreeMapNode(null, null); - - Comparator _comparator; - _Predicate _validKey; - - SoundSplayTreeMap([int compare(K key1, K key2), bool isValidKey(potentialKey)]) - : _comparator = compare ?? _defaultCompare(), - _validKey = isValidKey ?? ((v) => v is K); - - /// Creates a [SoundSplayTreeMap] that contains all key/value pairs of [other]. - /// - /// The keys must all be instances of [K] and the values of [V]. - /// The [other] map itself can have any type. - factory SoundSplayTreeMap.from(Map other, - [int compare(K key1, K key2), bool isValidKey(potentialKey)]) { - SoundSplayTreeMap result = SoundSplayTreeMap(compare, isValidKey); - other.forEach((k, v) { - result[k] = v; - }); - return result; - } - - /// Creates a [SoundSplayTreeMap] that contains all key/value pairs of [other]. - factory SoundSplayTreeMap.of(Map other, - [int compare(K key1, K key2), bool isValidKey(potentialKey)]) => - SoundSplayTreeMap(compare, isValidKey)..addAll(other); - - /// Creates a [SoundSplayTreeMap] where the keys and values are computed from the - /// [iterable]. - /// - /// For each element of the [iterable] this constructor computes a key/value - /// pair, by applying [key] and [value] respectively. - /// - /// The keys of the key/value pairs do not need to be unique. The last - /// occurrence of a key will simply overwrite any previous value. - /// - /// If no functions are specified for [key] and [value] the default is to - /// use the iterable value itself. - factory SoundSplayTreeMap.fromIterable(Iterable iterable, - {K key(element), - V value(element), - int compare(K key1, K key2), - bool isValidKey(potentialKey)}) { - SoundSplayTreeMap map = SoundSplayTreeMap(compare, isValidKey); - fillMapWithMappedIterable(map, iterable, key, value); - return map; - } - - static _id(x) => x; - - static void fillMapWithMappedIterable( - Map map, Iterable iterable, key(element), value(element)) { - key ??= _id; - value ??= _id; - - for (var element in iterable) { - map[key(element)] = value(element); - } - } - - static void fillMapWithIterables(Map map, Iterable keys, Iterable values) { - Iterator keyIterator = keys.iterator; - Iterator valueIterator = values.iterator; - - bool hasNextKey = keyIterator.moveNext(); - bool hasNextValue = valueIterator.moveNext(); - - while (hasNextKey && hasNextValue) { - map[keyIterator.current] = valueIterator.current; - hasNextKey = keyIterator.moveNext(); - hasNextValue = valueIterator.moveNext(); - } - - if (hasNextKey || hasNextValue) { - throw ArgumentError("Iterables do not have same length."); - } - } - - /// Creates a [SoundSplayTreeMap] associating the given [keys] to [values]. - /// - /// This constructor iterates over [keys] and [values] and maps each element - /// of [keys] to the corresponding element of [values]. - /// - /// If [keys] contains the same object multiple times, the last occurrence - /// overwrites the previous value. - /// - /// It is an error if the two [Iterable]s don't have the same length. - factory SoundSplayTreeMap.fromIterables(Iterable keys, Iterable values, - [int compare(K key1, K key2), bool isValidKey(potentialKey)]) { - SoundSplayTreeMap map = SoundSplayTreeMap(compare, isValidKey); - fillMapWithIterables(map, keys, values); - return map; - } - - int _compare(K key1, K key2) => _comparator(key1, key2); - - SoundSplayTreeMap._internal(); - - V operator [](Object key) { - if (!_validKey(key)) return null; - if (_root != null) { - int comp = _splay(key); - if (comp == 0) { - return _root.value; - } - } - return null; - } - - V remove(Object key) { - if (!_validKey(key)) return null; - _SoundSplayTreeMapNode mapRoot = _remove(key); - if (mapRoot != null) return mapRoot.value; - return null; - } - - void operator []=(K key, V value) { - if (key == null) throw ArgumentError(key); - // Splay on the key to move the last node on the search path for - // the key to the root of the tree. - int comp = _splay(key); - if (comp == 0) { - _root.value = value; - return; - } - _addNewRoot(_SoundSplayTreeMapNode(key, value), comp); - } - - V putIfAbsent(K key, V ifAbsent()) { - if (key == null) throw ArgumentError(key); - int comp = _splay(key); - if (comp == 0) { - return _root.value; - } - int modificationCount = _modificationCount; - int splayCount = _splayCount; - V value = ifAbsent(); - if (modificationCount != _modificationCount) { - throw ConcurrentModificationError(this); - } - if (splayCount != _splayCount) { - comp = _splay(key); - // Key is still not there, otherwise _modificationCount would be changed. - assert(comp != 0); - } - _addNewRoot(_SoundSplayTreeMapNode(key, value), comp); - return value; - } - - void addAll(Map other) { - other.forEach((K key, V value) { - this[key] = value; - }); - } - - bool get isEmpty { - return (_root == null); - } - - bool get isNotEmpty => !isEmpty; - - void forEach(void f(K key, V value)) { - Iterator<_SoundSplayTreeNode> nodes = _SoundSplayTreeNodeIterator(this); - while (nodes.moveNext()) { - _SoundSplayTreeMapNode node = nodes.current; - f(node.key, node.value); - } - } - - int get length { - return _count; - } - - void clear() { - _clear(); - } - - bool containsKey(Object key) { - return _validKey(key) && _splay(key) == 0; - } - - bool containsValue(Object value) { - int initialSplayCount = _splayCount; - bool visit(_SoundSplayTreeMapNode node) { - while (node != null) { - if (node.value == value) return true; - if (initialSplayCount != _splayCount) { - throw ConcurrentModificationError(this); - } - if (node.right != null && visit(node.right)) return true; - node = node.left; - } - return false; - } - - return visit(_root); - } - - Iterable get keys => _SoundSplayTreeKeyIterable(this); - - Iterable get values => _SoundSplayTreeValueIterable(this); - - /// Get the first key in the map. Returns [:null:] if the map is empty. - K firstKey() { - if (_root == null) return null; - return _first.key; - } - - /// Get the last key in the map. Returns [:null:] if the map is empty. - K lastKey() { - if (_root == null) return null; - return _last.key; - } - - /// Get the last key in the map that is strictly smaller than [key]. Returns - /// [:null:] if no key was not found. - K lastKeyBefore(K key) { - if (key == null) throw ArgumentError(key); - if (_root == null) return null; - int comp = _splay(key); - if (comp < 0) return _root.key; - _SoundSplayTreeNode node = _root.left; - if (node == null) return null; - while (node.right != null) { - node = node.right; - } - return node.key; - } - - /// Get the first key in the map that is strictly larger than [key]. Returns - /// [:null:] if no key was not found. - K firstKeyAfter(K key) { - if (key == null) throw ArgumentError(key); - if (_root == null) return null; - int comp = _splay(key); - if (comp > 0) return _root.key; - _SoundSplayTreeNode node = _root.right; - if (node == null) return null; - while (node.left != null) { - node = node.left; - } - return node.key; - } -} - - -abstract class _SoundSplayTreeIterator implements Iterator { - final _SoundSplayTree> _tree; - - /// Worklist of nodes to visit. - /// - /// These nodes have been passed over on the way down in a - /// depth-first left-to-right traversal. Visiting each node, - /// and their right subtrees will visit the remainder of - /// the nodes of a full traversal. - /// - /// Only valid as long as the original tree isn't reordered. - final List<_SoundSplayTreeNode> _workList = <_SoundSplayTreeNode>[]; - - /// Original modification counter of [_tree]. - /// - /// Incremented on [_tree] when a key is added or removed. - /// If it changes, iteration is aborted. - /// - /// Not final because some iterators may modify the tree knowingly, - /// and they update the modification count in that case. - int _modificationCount; - - /// Count of splay operations on [_tree] when [_workList] was built. - /// - /// If the splay count on [_tree] increases, [_workList] becomes invalid. - int _splayCount; - - /// Current node. - _SoundSplayTreeNode _currentNode; - - _SoundSplayTreeIterator(_SoundSplayTree> tree) - : _tree = tree, - _modificationCount = tree._modificationCount, - _splayCount = tree._splayCount { - _findLeftMostDescendant(tree._root); - } - - _SoundSplayTreeIterator.startAt(_SoundSplayTree> tree, K startKey) - : _tree = tree, - _modificationCount = tree._modificationCount { - if (tree._root == null) return; - int compare = tree._splay(startKey); - _splayCount = tree._splayCount; - if (compare < 0) { - // Don't include the root, start at the next element after the root. - _findLeftMostDescendant(tree._root.right); - } else { - _workList.add(tree._root); - } - } - - T get current { - if (_currentNode == null) return null; - return _getValue(_currentNode); - } - - void _findLeftMostDescendant(_SoundSplayTreeNode node) { - while (node != null) { - _workList.add(node); - node = node.left; - } - } - - /// Called when the tree structure of the tree has changed. - /// - /// This can be caused by a splay operation. - /// If the key-set changes, iteration is aborted before getting - /// here, so we know that the keys are the same as before, it's - /// only the tree that has been reordered. - void _rebuildWorkList(_SoundSplayTreeNode currentNode) { - assert(_workList.isNotEmpty); - _workList.clear(); - if (currentNode == null) { - _findLeftMostDescendant(_tree._root); - } else { - _tree._splay(currentNode.key); - _findLeftMostDescendant(_tree._root.right); - assert(_workList.isNotEmpty); - } - } - - bool moveNext() { - if (_modificationCount != _tree._modificationCount) { - throw ConcurrentModificationError(_tree); - } - // Picks the next element in the worklist as current. - // Updates the worklist with the left-most path of the current node's - // right-hand child. - // If the worklist is no longer valid (after a splay), it is rebuild - // from scratch. - if (_workList.isEmpty) { - _currentNode = null; - return false; - } - if (_tree._splayCount != _splayCount && _currentNode != null) { - _rebuildWorkList(_currentNode); - } - _currentNode = _workList.removeLast(); - _findLeftMostDescendant(_currentNode.right); - return true; - } - - T _getValue(_SoundSplayTreeNode node); -} - -class _SoundSplayTreeKeyIterable extends EfficientLengthIterable { - _SoundSplayTree> _tree; - _SoundSplayTreeKeyIterable(this._tree); - int get length => _tree._count; - bool get isEmpty => _tree._count == 0; - Iterator get iterator => _SoundSplayTreeKeyIterator(_tree); - - Set toSet() { - SoundSplayTreeSet set = SoundSplayTreeSet(_tree._comparator, _tree._validKey); - set._count = _tree._count; - set._root = set._copyNode(_tree._root); - return set; - } -} - -class _SoundSplayTreeValueIterable extends EfficientLengthIterable { - SoundSplayTreeMap _map; - _SoundSplayTreeValueIterable(this._map); - int get length => _map._count; - bool get isEmpty => _map._count == 0; - Iterator get iterator => _SoundSplayTreeValueIterator(_map); -} - -class _SoundSplayTreeKeyIterator extends _SoundSplayTreeIterator { - _SoundSplayTreeKeyIterator(_SoundSplayTree> map) : super(map); - K _getValue(_SoundSplayTreeNode node) => node.key; -} - -class _SoundSplayTreeValueIterator extends _SoundSplayTreeIterator { - _SoundSplayTreeValueIterator(SoundSplayTreeMap map) : super(map); - V _getValue(_SoundSplayTreeNode node) { - _SoundSplayTreeMapNode mapNode = node; - return mapNode.value; - } -} - -class _SoundSplayTreeNodeIterator - extends _SoundSplayTreeIterator> { - _SoundSplayTreeNodeIterator(_SoundSplayTree> tree) : super(tree); - _SoundSplayTreeNodeIterator.startAt( - _SoundSplayTree> tree, K startKey) - : super.startAt(tree, startKey); - _SoundSplayTreeNode _getValue(_SoundSplayTreeNode node) => node; -} - -/// A [Set] of objects that can be ordered relative to each other. -/// -/// The set is based on a self-balancing binary tree. It allows most operations -/// in amortized logarithmic time. -/// -/// Elements of the set are compared using the `compare` function passed in -/// the constructor, both for ordering and for equality. -/// If the set contains only an object `a`, then `set.contains(b)` -/// will return `true` if and only if `compare(a, b) == 0`, -/// and the value of `a == b` is not even checked. -/// If the compare function is omitted, the objects are assumed to be -/// [Comparable], and are compared using their [Comparable.compareTo] method. -/// Non-comparable objects (including `null`) will not work as an element -/// in that case. -class SoundSplayTreeSet extends _SoundSplayTree> - with IterableMixin, SetMixin { - _SoundSplayTreeNode _root; - final _SoundSplayTreeNode _dummy = _SoundSplayTreeNode(null); - - Comparator _comparator; - _Predicate _validKey; - - /// Create a new [SoundSplayTreeSet] with the given compare function. - /// - /// If the [compare] function is omitted, it defaults to [Comparable.compare], - /// and the elements must be comparable. - /// - /// A provided `compare` function may not work on all objects. It may not even - /// work on all `E` instances. - /// - /// For operations that add elements to the set, the user is supposed to not - /// pass in objects that doesn't work with the compare function. - /// - /// The methods [contains], [remove], [lookup], [removeAll] or [retainAll] - /// are typed to accept any object(s), and the [isValidKey] test can used to - /// filter those objects before handing them to the `compare` function. - /// - /// If [isValidKey] is provided, only values satisfying `isValidKey(other)` - /// are compared using the `compare` method in the methods mentioned above. - /// If the `isValidKey` function returns false for an object, it is assumed to - /// not be in the set. - /// - /// If omitted, the `isValidKey` function defaults to checking against the - /// type parameter: `other is E`. - SoundSplayTreeSet([int compare(E key1, E key2), bool isValidKey(potentialKey)]) - : _comparator = compare ?? _defaultCompare(), - _validKey = isValidKey ?? ((v) => v is E); - - /// Creates a [SoundSplayTreeSet] that contains all [elements]. - /// - /// The set works as if created by `new SplayTreeSet(compare, isValidKey)`. - /// - /// All the [elements] should be instances of [E] and valid arguments to - /// [compare]. - /// The `elements` iterable itself may have any element type, so this - /// constructor can be used to down-cast a `Set`, for example as: - /// ```dart - /// Set superSet = ...; - /// Set subSet = - /// new SplayTreeSet.from(superSet.whereType()); - /// ``` - factory SoundSplayTreeSet.from(Iterable elements, - [int compare(E key1, E key2), bool isValidKey(potentialKey)]) { - SoundSplayTreeSet result = SoundSplayTreeSet(compare, isValidKey); - for (final element in elements) { - E e = element; - result.add(e); - } - return result; - } - - /// Creates a [SoundSplayTreeSet] from [elements]. - /// - /// The set works as if created by `new SplayTreeSet(compare, isValidKey)`. - /// - /// All the [elements] should be valid as arguments to the [compare] function. - factory SoundSplayTreeSet.of(Iterable elements, - [int compare(E key1, E key2), bool isValidKey(potentialKey)]) => - SoundSplayTreeSet(compare, isValidKey)..addAll(elements); - - Set _newSet() => - SoundSplayTreeSet((T a, T b) => _comparator(a as E, b as E), _validKey); - - Set cast() => Set.castFrom(this, newSet: _newSet); - int _compare(E e1, E e2) => _comparator(e1, e2); - - // From Iterable. - - Iterator get iterator => _SoundSplayTreeKeyIterator(this); - - int get length => _count; - bool get isEmpty => _root == null; - bool get isNotEmpty => _root != null; - - E get first { - if (_count == 0) throw IterableElementError.noElement(); - return _first.key; - } - - E get last { - if (_count == 0) throw IterableElementError.noElement(); - return _last.key; - } - - E get single { - if (_count == 0) throw IterableElementError.noElement(); - if (_count > 1) throw IterableElementError.tooMany(); - return _root.key; - } - - // From Set. - bool contains(Object element) { - return _validKey(element) && _splay(element) == 0; - } - - bool add(E element) { - int compare = _splay(element); - if (compare == 0) return false; - _addNewRoot(_SoundSplayTreeNode(element), compare); - return true; - } - - bool remove(Object object) { - if (!_validKey(object)) return false; - return _remove(object) != null; - } - - void addAll(Iterable elements) { - for (E element in elements) { - int compare = _splay(element); - if (compare != 0) { - _addNewRoot(_SoundSplayTreeNode(element), compare); - } - } - } - - void removeAll(Iterable elements) { - for (Object element in elements) { - if (_validKey(element)) _remove(element); - } - } - - void retainAll(Iterable elements) { - // Build a set with the same sense of equality as this set. - SoundSplayTreeSet retainSet = SoundSplayTreeSet(_comparator, _validKey); - int modificationCount = _modificationCount; - for (Object object in elements) { - if (modificationCount != _modificationCount) { - // The iterator should not have side effects. - throw ConcurrentModificationError(this); - } - // Equivalent to this.contains(object). - if (_validKey(object) && _splay(object) == 0) { - retainSet.add(_root.key); - } - } - // Take over the elements from the retained set, if it differs. - if (retainSet._count != _count) { - _root = retainSet._root; - _count = retainSet._count; - _modificationCount++; - } - } - - E lookup(Object object) { - if (!_validKey(object)) return null; - int comp = _splay(object); - if (comp != 0) return null; - return _root.key; - } - - Set intersection(Set other) { - Set result = SoundSplayTreeSet(_comparator, _validKey); - for (E element in this) { - if (other.contains(element)) result.add(element); - } - return result; - } - - Set difference(Set other) { - Set result = SoundSplayTreeSet(_comparator, _validKey); - for (E element in this) { - if (!other.contains(element)) result.add(element); - } - return result; - } - - Set union(Set other) { - return _clone()..addAll(other); - } - - SoundSplayTreeSet _clone() { - var set = SoundSplayTreeSet(_comparator, _validKey); - set._count = _count; - set._root = _copyNode(_root); - return set; - } - - // Copies the structure of a SplayTree into a new similar structure. - // Works on _SplayTreeMapNode as well, but only copies the keys, - _SoundSplayTreeNode _copyNode(_SoundSplayTreeNode node) { - if (node == null) return null; - return _SoundSplayTreeNode(node.key) - ..left = _copyNode(node.left) - ..right = _copyNode(node.right); - } - - void clear() { - _clear(); - } - - Set toSet() => _clone(); - - String toString() => IterableBase.iterableToFullString(this, '{', '}'); -} diff --git a/benchmarks/Startup/dart2/Startup.dart b/benchmarks/Startup/dart2/Startup.dart deleted file mode 100644 index 54cb577b7be..00000000000 --- a/benchmarks/Startup/dart2/Startup.dart +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:convert'; -import 'dart:io'; - -import 'package:compiler/src/dart2js.dart' as dart2js; - -Future main(List args) async { - if (args.contains('--child')) { - return; - } - - // Include dart2js and prevent tree-shaking to make this program have a - // non-trival snapshot size. - if (args.contains('--train')) { - args.remove('--train'); - return dart2js.main(args); - } - - var tempDir; - var events; - try { - tempDir = await Directory.systemTemp.createTemp(); - final timelinePath = - tempDir.uri.resolve('Startup-timeline.json').toFilePath(); - final p = await Process.run(Platform.executable, [ - ...Platform.executableArguments, - '--timeline_recorder=file:$timelinePath', - '--timeline_streams=VM,Isolate,Embedder', - Platform.script.toFilePath(), - '--child', - ]); - if (p.exitCode != 0) { - print(p.stdout); - print(p.stderr); - throw 'Child process failed: ${p.exitCode}'; - } - - events = jsonDecode(await File(timelinePath).readAsString()); - } finally { - await tempDir.delete(recursive: true); - } - - var mainIsolateId; - for (final event in events) { - if (event['name'] == 'InitializeIsolate' && - event['args']['isolateName'] == 'main') { - mainIsolateId = event['args']['isolateId']; - } - } - if (mainIsolateId == null) { - throw 'Could not determine main isolate'; - } - - void report(String name, String isolateId) { - var filtered = events.where((event) => event['name'] == name); - if (isolateId != null) { - filtered = filtered.where( - (event) => event['args']['isolateId'] == isolateId, - ); - } - var micros; - final durations = filtered.where((event) => event['ph'] == 'X'); - final begins = filtered.where((event) => event['ph'] == 'B'); - final ends = filtered.where((event) => event['ph'] == 'E'); - if (durations.length == 1 && begins.length == 0 && ends.length == 0) { - micros = durations.single['dur']; - } else if (durations.length == 0 && - begins.length == 1 && - ends.length == 1) { - micros = ends.single['ts'] - begins.single['ts']; - } else { - print(durations.toList()); - print(begins.toList()); - print(ends.toList()); - throw '$name is missing or ambiguous'; - } - print('Startup.$name(StartupTime): $micros us.'); - } - - report('CreateIsolateGroupAndSetupHelper', null); - report('InitializeIsolate', mainIsolateId); - report('ReadProgramSnapshot', mainIsolateId); -} diff --git a/benchmarks/StringPool/dart2/StringPool.dart b/benchmarks/StringPool/dart2/StringPool.dart deleted file mode 100644 index 6ada6a4107c..00000000000 --- a/benchmarks/StringPool/dart2/StringPool.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.7 - -import '../dart/StringPool.dart' as primary; - -void main() { - primary.main(); -} diff --git a/benchmarks/StringPool/dart2/StringPool100.dart b/benchmarks/StringPool/dart2/StringPool100.dart deleted file mode 100644 index 471de66d882..00000000000 --- a/benchmarks/StringPool/dart2/StringPool100.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.7 - -import '../dart/StringPool100.dart' as primary; - -void main() { - primary.main(); -} diff --git a/benchmarks/TypedData/dart2/TypedData.dart b/benchmarks/TypedData/dart2/TypedData.dart deleted file mode 100644 index 89bcac8f2c7..00000000000 --- a/benchmarks/TypedData/dart2/TypedData.dart +++ /dev/null @@ -1,879 +0,0 @@ -// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// Micro-benchmarks for typed data setters and getters. -// -// @dart=2.9 - -import 'dart:typed_data'; -import 'package:benchmark_harness/benchmark_harness.dart'; - -// -// Typed constant setters. -// - -void doSetInt8(Int8List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetUint8(Uint8List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetUint8Clamped(Uint8ClampedList list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetInt16(Int16List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetUint16(Uint16List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetInt32(Int32List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetUint32(Uint32List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetInt64(Int64List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetUint64(Uint64List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1; - } -} - -void doSetFloat32(Float32List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1.0; - } -} - -void doSetFloat64(Float64List list) { - for (int i = 0; i < list.length; i++) { - list[i] = 1.0; - } -} - -// -// Typed variable setters. -// - -void doSetInt8Var(Int8List list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetUint8Var(Uint8List list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetUint8ClampedVar(Uint8ClampedList list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetInt16Var(Int16List list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetUint16Var(Uint16List list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetInt32Var(Int32List list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetUint32Var(Uint32List list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetInt64Var(Int64List list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetUint64Var(Uint64List list) { - for (int i = 0; i < list.length; i++) { - list[i] = i; - } -} - -void doSetFloat32Var(Float32List list) { - double x = 0.0; - for (int i = 0; i < list.length; i++) { - list[i] = x++; - } -} - -void doSetFloat64Var(Float64List list) { - double x = 0.0; - for (int i = 0; i < list.length; i++) { - list[i] = x++; - } -} - -// -// Typed getters. -// - -int doGetInt8(Int8List list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -int doGetUint8(Uint8List list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -int doGetUint8Clamped(Uint8ClampedList list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -int doGetInt16(Int16List list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -int doGetUint16(Uint16List list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -int doGetInt32(Int32List list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -int doGetUint32(Uint32List list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -int doGetInt64(Int64List list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -int doGetUint64(Uint64List list) { - int x = 0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -double doGetFloat32(Float32List list) { - double x = 0.0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -double doGetFloat64(Float64List list) { - double x = 0.0; - for (int i = 0; i < list.length; i++) { - x += list[i]; - } - return x; -} - -// -// Benchmark fixtures. -// - -const N = 1000; - -class Int8ListBench extends BenchmarkBase { - var list = Int8List(N); - Int8ListBench() : super('TypedData.Int8ListBench'); - @override - void run() { - doSetInt8(list); - final int x = doGetInt8(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint8ListBench extends BenchmarkBase { - var list = Uint8List(N); - Uint8ListBench() : super('TypedData.Uint8ListBench'); - @override - void run() { - doSetUint8(list); - final int x = doGetUint8(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint8ClampedListBench extends BenchmarkBase { - var list = Uint8ClampedList(N); - Uint8ClampedListBench() : super('TypedData.Uint8ClampedListBench'); - @override - void run() { - doSetUint8Clamped(list); - final int x = doGetUint8Clamped(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int16ListBench extends BenchmarkBase { - var list = Int16List(N); - Int16ListBench() : super('TypedData.Int16ListBench'); - @override - void run() { - doSetInt16(list); - final int x = doGetInt16(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint16ListBench extends BenchmarkBase { - var list = Uint16List(N); - Uint16ListBench() : super('TypedData.Uint16ListBench'); - @override - void run() { - doSetUint16(list); - final int x = doGetUint16(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int32ListBench extends BenchmarkBase { - var list = Int32List(N); - Int32ListBench() : super('TypedData.Int32ListBench'); - @override - void run() { - doSetInt32(list); - final int x = doGetInt32(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint32ListBench extends BenchmarkBase { - var list = Uint32List(N); - Uint32ListBench() : super('TypedData.Uint32ListBench'); - @override - void run() { - doSetUint32(list); - final int x = doGetUint32(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int64ListBench extends BenchmarkBase { - var list = Int64List(N); - Int64ListBench() : super('TypedData.Int64ListBench'); - @override - void run() { - doSetInt64(list); - final int x = doGetInt64(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint64ListBench extends BenchmarkBase { - var list = Uint64List(N); - Uint64ListBench() : super('TypedData.Uint64ListBench'); - @override - void run() { - doSetUint64(list); - final int x = doGetUint64(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Float32ListBench extends BenchmarkBase { - var list = Float32List(N); - Float32ListBench() : super('TypedData.Float32ListBench'); - @override - void run() { - doSetFloat32(list); - final double x = doGetFloat32(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Float64ListBench extends BenchmarkBase { - var list = Float64List(N); - Float64ListBench() : super('TypedData.Float64ListBench'); - @override - void run() { - doSetFloat64(list); - final double x = doGetFloat64(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int8ListViewBench extends BenchmarkBase { - var list = Int8List.view(Int8List(N).buffer); - Int8ListViewBench() : super('TypedData.Int8ListViewBench'); - @override - void run() { - doSetInt8(list); - final int x = doGetInt8(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint8ListViewBench extends BenchmarkBase { - var list = Uint8List.view(Uint8List(N).buffer); - Uint8ListViewBench() : super('TypedData.Uint8ListViewBench'); - @override - void run() { - doSetUint8(list); - final int x = doGetUint8(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint8ClampedListViewBench extends BenchmarkBase { - var list = Uint8ClampedList.view(Uint8ClampedList(N).buffer); - Uint8ClampedListViewBench() : super('TypedData.Uint8ClampedListViewBench'); - @override - void run() { - doSetUint8Clamped(list); - final int x = doGetUint8Clamped(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int16ListViewBench extends BenchmarkBase { - var list = Int16List.view(Int16List(N).buffer); - Int16ListViewBench() : super('TypedData.Int16ListViewBench'); - @override - void run() { - doSetInt16(list); - final int x = doGetInt16(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint16ListViewBench extends BenchmarkBase { - var list = Uint16List.view(Uint16List(N).buffer); - Uint16ListViewBench() : super('TypedData.Uint16ListViewBench'); - @override - void run() { - doSetUint16(list); - final int x = doGetUint16(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int32ListViewBench extends BenchmarkBase { - var list = Int32List.view(Int32List(N).buffer); - Int32ListViewBench() : super('TypedData.Int32ListViewBench'); - @override - void run() { - doSetInt32(list); - final int x = doGetInt32(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint32ListViewBench extends BenchmarkBase { - var list = Uint32List.view(Uint32List(N).buffer); - Uint32ListViewBench() : super('TypedData.Uint32ListViewBench'); - @override - void run() { - doSetUint32(list); - final int x = doGetUint32(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int64ListViewBench extends BenchmarkBase { - var list = Int64List.view(Int64List(N).buffer); - Int64ListViewBench() : super('TypedData.Int64ListViewBench'); - @override - void run() { - doSetInt64(list); - final int x = doGetInt64(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint64ListViewBench extends BenchmarkBase { - var list = Uint64List.view(Uint64List(N).buffer); - Uint64ListViewBench() : super('TypedData.Uint64ListViewBench'); - @override - void run() { - doSetUint64(list); - final int x = doGetUint64(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Float32ListViewBench extends BenchmarkBase { - var list = Float32List.view(Float32List(N).buffer); - Float32ListViewBench() : super('TypedData.Float32ListViewBench'); - @override - void run() { - doSetFloat32(list); - final double x = doGetFloat32(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Float64ListViewBench extends BenchmarkBase { - var list = Float64List.view(Float64List(N).buffer); - Float64ListViewBench() : super('TypedData.Float64ListViewBench'); - @override - void run() { - doSetFloat64(list); - final double x = doGetFloat64(list); - if (x != N) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int8ListVarBench extends BenchmarkBase { - var list = Int8List(N); - Int8ListVarBench() : super('TypedData.Int8ListVarBench'); - @override - void run() { - doSetInt8Var(list); - final int x = doGetInt8(list); - if (x != -212) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint8ListVarBench extends BenchmarkBase { - var list = Uint8List(N); - Uint8ListVarBench() : super('TypedData.Uint8ListVarBench'); - @override - void run() { - doSetUint8Var(list); - final int x = doGetUint8(list); - if (x != 124716) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint8ClampedListVarBench extends BenchmarkBase { - var list = Uint8ClampedList(N); - Uint8ClampedListVarBench() : super('TypedData.Uint8ClampedListVarBench'); - @override - void run() { - doSetUint8ClampedVar(list); - final int x = doGetUint8Clamped(list); - if (x != 222360) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int16ListVarBench extends BenchmarkBase { - var list = Int16List(N); - Int16ListVarBench() : super('TypedData.Int16ListVarBench'); - @override - void run() { - doSetInt16Var(list); - final int x = doGetInt16(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint16ListVarBench extends BenchmarkBase { - var list = Uint16List(N); - Uint16ListVarBench() : super('TypedData.Uint16ListVarBench'); - @override - void run() { - doSetUint16Var(list); - final int x = doGetUint16(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int32ListVarBench extends BenchmarkBase { - var list = Int32List(N); - Int32ListVarBench() : super('TypedData.Int32ListVarBench'); - @override - void run() { - doSetInt32Var(list); - final int x = doGetInt32(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint32ListVarBench extends BenchmarkBase { - var list = Uint32List(N); - Uint32ListVarBench() : super('TypedData.Uint32ListVarBench'); - @override - void run() { - doSetUint32Var(list); - final int x = doGetUint32(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int64ListVarBench extends BenchmarkBase { - var list = Int64List(N); - Int64ListVarBench() : super('TypedData.Int64ListVarBench'); - @override - void run() { - doSetInt64Var(list); - final int x = doGetInt64(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint64ListVarBench extends BenchmarkBase { - var list = Uint64List(N); - Uint64ListVarBench() : super('TypedData.Uint64ListVarBench'); - @override - void run() { - doSetUint64Var(list); - final int x = doGetUint64(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Float32ListVarBench extends BenchmarkBase { - var list = Float32List(N); - Float32ListVarBench() : super('TypedData.Float32ListVarBench'); - @override - void run() { - doSetFloat32Var(list); - final double x = doGetFloat32(list); - if (x != 499500.0) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Float64ListVarBench extends BenchmarkBase { - var list = Float64List(N); - Float64ListVarBench() : super('TypedData.Float64ListVarBench'); - @override - void run() { - doSetFloat64Var(list); - final double x = doGetFloat64(list); - if (x != 499500.0) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int8ListViewVarBench extends BenchmarkBase { - var list = Int8List.view(Int8List(N).buffer); - Int8ListViewVarBench() : super('TypedData.Int8ListViewVarBench'); - @override - void run() { - doSetInt8Var(list); - final int x = doGetInt8(list); - if (x != -212) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint8ListViewVarBench extends BenchmarkBase { - var list = Uint8List.view(Uint8List(N).buffer); - Uint8ListViewVarBench() : super('TypedData.Uint8ListViewVarBench'); - @override - void run() { - doSetUint8Var(list); - final int x = doGetUint8(list); - if (x != 124716) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint8ClampedListViewVarBench extends BenchmarkBase { - var list = Uint8ClampedList.view(Uint8ClampedList(N).buffer); - Uint8ClampedListViewVarBench() - : super('TypedData.Uint8ClampedListViewVarBench'); - @override - void run() { - doSetUint8ClampedVar(list); - final int x = doGetUint8Clamped(list); - if (x != 222360) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int16ListViewVarBench extends BenchmarkBase { - var list = Int16List.view(Int16List(N).buffer); - Int16ListViewVarBench() : super('TypedData.Int16ListViewVarBench'); - @override - void run() { - doSetInt16Var(list); - final int x = doGetInt16(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint16ListViewVarBench extends BenchmarkBase { - var list = Uint16List.view(Uint16List(N).buffer); - Uint16ListViewVarBench() : super('TypedData.Uint16ListViewVarBench'); - @override - void run() { - doSetUint16Var(list); - final int x = doGetUint16(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int32ListViewVarBench extends BenchmarkBase { - var list = Int32List.view(Int32List(N).buffer); - Int32ListViewVarBench() : super('TypedData.Int32ListViewVarBench'); - @override - void run() { - doSetInt32Var(list); - final int x = doGetInt32(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint32ListViewVarBench extends BenchmarkBase { - var list = Uint32List.view(Uint32List(N).buffer); - Uint32ListViewVarBench() : super('TypedData.Uint32ListViewVarBench'); - @override - void run() { - doSetUint32Var(list); - final int x = doGetUint32(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Int64ListViewVarBench extends BenchmarkBase { - var list = Int64List.view(Int64List(N).buffer); - Int64ListViewVarBench() : super('TypedData.Int64ListViewVarBench'); - @override - void run() { - doSetInt64Var(list); - final int x = doGetInt64(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Uint64ListViewVarBench extends BenchmarkBase { - var list = Uint64List.view(Uint64List(N).buffer); - Uint64ListViewVarBench() : super('TypedData.Uint64ListViewVarBench'); - @override - void run() { - doSetUint64Var(list); - final int x = doGetUint64(list); - if (x != 499500) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Float32ListViewVarBench extends BenchmarkBase { - var list = Float32List.view(Float32List(N).buffer); - Float32ListViewVarBench() : super('TypedData.Float32ListViewVarBench'); - @override - void run() { - doSetFloat32Var(list); - final double x = doGetFloat32(list); - if (x != 499500.0) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -class Float64ListViewVarBench extends BenchmarkBase { - var list = Float64List.view(Float64List(N).buffer); - Float64ListViewVarBench() : super('TypedData.Float64ListViewVarBench'); - @override - void run() { - doSetFloat64Var(list); - final double x = doGetFloat64(list); - if (x != 499500.0) { - throw Exception('$name: Unexpected result: $x'); - } - } -} - -// -// Main driver. -// - -void main() { - final microBenchmarks = [ - () => Int8ListBench(), - () => Uint8ListBench(), - () => Uint8ClampedListBench(), - () => Int16ListBench(), - () => Uint16ListBench(), - () => Int32ListBench(), - () => Uint32ListBench(), - () => Int64ListBench(), - () => Uint64ListBench(), - () => Float32ListBench(), - () => Float64ListBench(), - () => Int8ListViewBench(), - () => Uint8ListViewBench(), - () => Uint8ClampedListViewBench(), - () => Int16ListViewBench(), - () => Uint16ListViewBench(), - () => Int32ListViewBench(), - () => Uint32ListViewBench(), - () => Int64ListViewBench(), - () => Uint64ListViewBench(), - () => Float32ListViewBench(), - () => Float64ListViewBench(), - () => Int8ListVarBench(), - () => Uint8ListVarBench(), - () => Uint8ClampedListVarBench(), - () => Int16ListVarBench(), - () => Uint16ListVarBench(), - () => Int32ListVarBench(), - () => Uint32ListVarBench(), - () => Int64ListVarBench(), - () => Uint64ListVarBench(), - () => Float32ListVarBench(), - () => Float64ListVarBench(), - () => Int8ListViewVarBench(), - () => Uint8ListViewVarBench(), - () => Uint8ClampedListViewVarBench(), - () => Int16ListViewVarBench(), - () => Uint16ListViewVarBench(), - () => Int32ListViewVarBench(), - () => Uint32ListViewVarBench(), - () => Int64ListViewVarBench(), - () => Uint64ListViewVarBench(), - () => Float32ListViewVarBench(), - () => Float64ListViewVarBench(), - ]; - for (var mbm in microBenchmarks) { - mbm().report(); - } -} diff --git a/benchmarks/TypedDataCopy/dart2/TypedDataCopy.dart b/benchmarks/TypedDataCopy/dart2/TypedDataCopy.dart deleted file mode 100644 index d804efa9391..00000000000 --- a/benchmarks/TypedDataCopy/dart2/TypedDataCopy.dart +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'TypedDataCopyLib.dart'; - -void main() { - final benchmarks = [ - () => Int8ViewToInt8View(), - () => Int8ToInt8(), - () => Int8ToUint8Clamped(), - () => Int8ViewToInt8(), - () => ByteSwap(), - ]; - - // Run all the code to ensure consistent polymorphism in shared code. - for (var bm in benchmarks) { - bm() - ..setup() - ..run() - ..run(); - } - - for (var bm in benchmarks) { - bm().report(); - } -} diff --git a/benchmarks/TypedDataCopy/dart2/TypedDataCopyLib.dart b/benchmarks/TypedDataCopy/dart2/TypedDataCopyLib.dart deleted file mode 100644 index 975f9f6ff61..00000000000 --- a/benchmarks/TypedDataCopy/dart2/TypedDataCopyLib.dart +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// @dart=2.9 - -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart'; - -// Typed data block copy benchmark. - -const int size = 256 * 1024; - -class Int8ViewToInt8View extends BenchmarkBase { - Int8ViewToInt8View() : super('TypedDataCopy.Int8ViewToInt8View'); - - var a1; - var a2; - - @override - void setup() { - final storage = Int8List(size); - final buffer = storage.buffer; - a1 = Int8List.view(buffer, 0, buffer.lengthInBytes); - a2 = Int8List.view(buffer, 8, buffer.lengthInBytes - 8); - - for (int i = 0; i < a1.length; i++) { - a1[i] = i; - } - } - - @override - void run() { - // Shift all bytes 8 positions nearer to the front. - a1.setRange(0, a2.length, a2); - final check = a1[a1.length - 8 - 1]; - if (check != -1) throw 'Bad $check'; - } -} - -class Int8ViewToInt8 extends BenchmarkBase { - Int8ViewToInt8() : super('TypedDataCopy.Int8ViewToInt8'); - - var a1; - var a2; - - @override - void setup() { - a1 = Int8List(size); - final buffer = a1.buffer; - a2 = Int8List.view(buffer, 8, buffer.lengthInBytes - 8); - - for (int i = 0; i < a1.length; i++) { - a1[i] = i; - } - } - - @override - void run() { - // Shift all bytes 8 positions nearer to the front. - a1.setRange(0, a2.length, a2); - final check = a1[a1.length - 8 - 1]; - if (check != -1) { - throw 'Bad $check'; - } - } -} - -class Int8ToInt8 extends BenchmarkBase { - Int8ToInt8() : super('TypedDataCopy.Int8ToInt8'); - - var a1; - - @override - void setup() { - a1 = Int8List(size); - for (int i = 0; i < a1.length; i++) { - a1[i] = i; - } - } - - @override - void run() { - // Shift all bytes 8 positions nearer to the front. - a1.setRange(0, a1.length - 8, a1, 8); - final check = a1[a1.length - 8 - 1]; - if (check != -1) { - throw 'Bad $check'; - } - } -} - -class Int8ToUint8Clamped extends BenchmarkBase { - Int8ToUint8Clamped() : super('TypedDataCopy.Int8ToUint8Clamped'); - - var a1; - var a2; - - @override - void setup() { - a1 = Uint8ClampedList(size); - a2 = Int8List(size); - for (int i = 0; i < a2.length; i++) { - a2[i] = i; - } - } - - @override - void run() { - a1.setRange(0, a2.length, a2, 0); - var check = a1[100]; - if (check != 100) { - throw 'Bad $check'; - } - check = a1[200]; - if (check != 0) { - throw 'Bad $check'; - } - } -} - -class ByteSwap extends BenchmarkBase { - ByteSwap() : super('TypedDataCopy.ByteSwap'); - - final a8 = Int8List(size ~/ 16); - - @override - void setup() { - for (int i = 0; i < a8.length; i++) { - a8[i] = i; - } - } - - void check(e0, e1, e2, e3) { - final a0 = a8[0]; - final a1 = a8[1]; - final a2 = a8[2]; - final a3 = a8[3]; - if (a0 != e0 || a1 != e1 || a2 != e2 || a3 != e3) { - throw 'Bad: $a0 $a1 $a2 $a3, expected $e0 $e1 $e2 $e3'; - } - } - - @override - void run() { - final b = ByteData.view(a8.buffer); - - // Do several passes over the data, reading and writing in different widths - // with different endianes. - - for (int i = 0; i < b.lengthInBytes; i += 4) { - final e = b.getInt32(i); // Implicit big endian. - b.setInt32(i, e, Endian.little); - } - check(3, 2, 1, 0); - - for (int i = 0; i < b.lengthInBytes; i += 2) { - final e = b.getInt16(i, Endian.big); - b.setInt16(i, e, Endian.little); - } - check(2, 3, 0, 1); - - for (int i = 0; i < b.lengthInBytes; i += 4) { - final e = b.getUint32(i, Endian.little); - b.setUint32(i, e); // Implicit big endian. - } - check(1, 0, 3, 2); - - for (int i = 0; i < b.lengthInBytes; i += 2) { - final e = b.getUint16(i, Endian.little); - b.setUint16(i, e, Endian.big); - } - check(0, 1, 2, 3); // Back to normal for the next run(). - } -} diff --git a/benchmarks/TypedDataDuplicate/dart2/TypedDataDuplicate.dart b/benchmarks/TypedDataDuplicate/dart2/TypedDataDuplicate.dart deleted file mode 100644 index 676f6006c4e..00000000000 --- a/benchmarks/TypedDataDuplicate/dart2/TypedDataDuplicate.dart +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// Micro-benchmarks for copying typed data lists. - -// @dart=2.9 - -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart'; - -abstract class Uint8ListCopyBenchmark extends BenchmarkBase { - final int size; - Uint8List input; - Uint8List result; - - Uint8ListCopyBenchmark(String method, this.size) - : super('TypedDataDuplicate.Uint8List.$size.$method'); - - @override - void setup() { - input = Uint8List(size); - for (var i = 0; i < size; ++i) { - input[i] = (i + 3) & 0xff; - } - } - - @override - void teardown() { - for (var i = 0; i < size; ++i) { - if (result[i] != ((i + 3) & 0xff)) { - throw 'Unexpected result'; - } - } - } -} - -class Uint8ListCopyViaFromListBenchmark extends Uint8ListCopyBenchmark { - Uint8ListCopyViaFromListBenchmark(int size) : super('fromList', size); - - @override - void run() { - result = Uint8List.fromList(input); - } -} - -class Uint8ListCopyViaLoopBenchmark extends Uint8ListCopyBenchmark { - Uint8ListCopyViaLoopBenchmark(int size) : super('loop', size); - - @override - void run() { - final input = this.input; - final result = Uint8List(input.length); - for (var i = 0; i < input.length; i++) { - result[i] = input[i]; - } - this.result = result; - } -} - -abstract class Float64ListCopyBenchmark extends BenchmarkBase { - final int size; - Float64List input; - Float64List result; - - Float64ListCopyBenchmark(String method, this.size) - : super('TypedDataDuplicate.Float64List.$size.$method'); - - @override - void setup() { - input = Float64List(size); - for (var i = 0; i < size; ++i) { - input[i] = (i - 7).toDouble(); - } - } - - @override - void teardown() { - for (var i = 0; i < size; ++i) { - if (result[i] != (i - 7).toDouble()) { - throw 'Unexpected result'; - } - } - } -} - -class Float64ListCopyViaFromListBenchmark extends Float64ListCopyBenchmark { - Float64ListCopyViaFromListBenchmark(int size) : super('fromList', size); - - @override - void run() { - result = Float64List.fromList(input); - } -} - -class Float64ListCopyViaLoopBenchmark extends Float64ListCopyBenchmark { - Float64ListCopyViaLoopBenchmark(int size) : super('loop', size); - - @override - void run() { - final input = this.input; - final result = Float64List(input.length); - for (var i = 0; i < input.length; i++) { - result[i] = input[i]; - } - this.result = result; - } -} - -void main() { - final sizes = [8, 32, 256, 16384]; - final benchmarks = [ - for (int size in sizes) ...[ - Uint8ListCopyViaLoopBenchmark(size), - Uint8ListCopyViaFromListBenchmark(size), - ], - for (int size in sizes) ...[ - Float64ListCopyViaLoopBenchmark(size), - Float64ListCopyViaFromListBenchmark(size), - ], - ]; - for (var bench in benchmarks) { - bench.report(); - } -} diff --git a/benchmarks/Utf8Decode/dart2/Utf8Decode.dart b/benchmarks/Utf8Decode/dart2/Utf8Decode.dart deleted file mode 100644 index a264f092575..00000000000 --- a/benchmarks/Utf8Decode/dart2/Utf8Decode.dart +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// Benchmark for UTF-8 decoding - -// @dart=2.9 - -import 'dart:convert'; -import 'dart:typed_data'; - -import 'package:benchmark_harness/benchmark_harness.dart'; - -import 'datext_latin1_10k.dart'; -import 'entext_ascii_10k.dart'; -import 'netext_3_10k.dart'; -import 'rutext_2_10k.dart'; -import 'sktext_10k.dart'; -import 'zhtext_10k.dart'; - -class Utf8Decode extends BenchmarkBase { - final String language; - final String text; - final int size; - final bool allowMalformed; - List chunks; - int totalInputSize; - int totalOutputSize; - - static String _makeName(String language, int size, bool allowMalformed) { - String name = 'Utf8Decode.$language.'; - name += - size >= 1000000 - ? '${size ~/ 1000000}M' - : size >= 1000 - ? '${size ~/ 1000}k' - : '$size'; - if (allowMalformed) name += '.malformed'; - return name; - } - - Utf8Decode(this.language, this.text, this.size, this.allowMalformed) - : super(_makeName(language, size, allowMalformed)); - - @override - void setup() { - final Uint8List data = utf8.encode(text); - if (data.length != 10000) { - throw 'Expected input data of exactly 10000 bytes.'; - } - if (size < data.length) { - // Split into chunks. - chunks = []; - int startPos = 0; - for (int pos = size; pos < data.length; pos += size) { - int endPos = pos; - while ((data[endPos] & 0xc0) == 0x80) { - endPos--; - } - chunks.add(Uint8List.fromList(data.sublist(startPos, endPos))); - startPos = endPos; - } - chunks.add(Uint8List.fromList(data.sublist(startPos, data.length))); - totalInputSize = data.length; - totalOutputSize = text.length; - } else if (size > data.length) { - // Repeat data to the desired length. - final Uint8List expanded = Uint8List(size); - for (int i = 0; i < size; i++) { - expanded[i] = data[i % data.length]; - } - chunks = [expanded]; - totalInputSize = size; - totalOutputSize = text.length * size ~/ data.length; - } else { - // Use data as is. - chunks = [data]; - totalInputSize = data.length; - totalOutputSize = text.length; - } - } - - @override - void run() { - int lengthSum = 0; - for (int i = 0; i < chunks.length; i++) { - final String s = utf8.decode(chunks[i], allowMalformed: allowMalformed); - lengthSum += s.length; - } - if (lengthSum != totalOutputSize) { - throw 'Output length doesn\'t match expected.'; - } - } - - @override - void exercise() { - // Only a single run per measurement. - run(); - } - - @override - double measure() { - // Report time per input byte. - return super.measure() / totalInputSize; - } - - @override - void report() { - // Report time in nanoseconds. - final double score = measure() * 1000.0; - print('$name(RunTime): $score ns.'); - } -} - -void main(List args) { - const texts = {'en': en, 'da': da, 'sk': sk, 'ru': ru, 'ne': ne, 'zh': zh}; - final bool testMalformed = - args != null && args.isNotEmpty && args.first == 'malformed'; - final benchmarks = [ - // Only benchmark with allowMalformed: false unless specified otherwise. - for (bool allowMalformed in [false, if (testMalformed) true]) - for (int size in [10, 10000, 10000000]) - for (String language in texts.keys) - () => Utf8Decode(language, texts[language], size, allowMalformed), - ]; - - for (var bm in benchmarks) { - bm().report(); - } -} diff --git a/benchmarks/Utf8Decode/dart2/datext_latin1_10k.dart b/benchmarks/Utf8Decode/dart2/datext_latin1_10k.dart deleted file mode 100644 index 4e13b7e7f01..00000000000 --- a/benchmarks/Utf8Decode/dart2/datext_latin1_10k.dart +++ /dev/null @@ -1,64 +0,0 @@ -// This text is an extract from the Danish Wikipedia article about Donald Duck -// (Anders And): https://da.wikipedia.org/wiki/Anders_And -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String da = ''' -Anders And - -Anders Fauntleroy And er en berømt figur i Disneys tegnefilm og tegneserier. Selv om han ikke er særligt populær i USA, optræder han i mange ugeblade i Europa: I Norge, Tyskland, Sverige, Danmark, Holland, Italien med flere. Hans første optræden var i tegnefilmen "The Wise Little Hen" (Den kloge lille høne) fra 9. juni 1934. Hans karakteristiske stemme blev indtalt af radiokomikeren Clarence Nash, der siden fast lagde stemme til. -Efter Nash' død i 1985 overtog tegnefilmsdubberen Tony Anselmo. Det var i øvrigt Nash selv, der trænede Anselmo til at lyde som Anders And. I Danmark har tre lagt stemme til Anders And: Bjarne H. Hansen, Dick Kaysø og Peter Zhelder. Dick Kaysø og Peter Zhelder lægger stadigvæk stemme til ham. - -Anders And var en bifigur til filmen Den lille kloge Høne, han havde et langt spidst næb og en utrolig kort lunte; der skulle ikke meget til for at udløse et raserianfald hos ham. Klassikerne er fra 1930'erne, hvor Mickey, Fedtmule og Anders er et trekløver, der er film som "Mickeys Campingvogn," "Tårnuret" og "Ensomme Spøgelser." Fred Spencer og Dick Lundy var animatorer. Efterhånden opnåede anden større popularitet, hvad der ikke rigtig huede Disney, der ikke brød sig om den krakilske and. Men Anders blev forfremmet til hovedfigur i en serie film, der begyndte med "Anders And og Strudsen" i 1938. Med den var det "ande-teamet" hos Disney født: instruktøren Jack King og assistenterne Carl Barks (den senere serieskaber), Chuck Couch, Harry Reeves og Jack Hannah. Han var stadigvæk en hidsigprop, men han blev gjort mere nuanceret, og nye figurer blev tilføjet som nevøerne Rip, Rap og Rup, kæresten Andersine And og i en enkelt film Fætter Guf. - -Under 2. verdenskrig blev der lavet film om anden i militærtjeneste, som han selvfølgelig gør meget klodset. Mest kendt er "Der Fuehrers Face" fra 1943, hvor anden drømmer, at han er i diktaturstaten Nutziland. Den film blev arkiveret af Disney efter krigen, men er senere vist meget uofficielt. Desuden medvirkede han i to mindre kendte spillefilm "Saludos Amigos" 1943 og "The Three Caballeros" 1945, der gav et lystigt billede af livet i Latinamerika. - -Efter krigen blev omgivelserne mere hjemlige, men næppe mere fredfyldte. I 1947 overtog Jack Hannah pladsen som instruktør. Filmene handlede ofte om klammeri med andre, det kunne være en bi, Chip og Chap eller bare ting han ikke kunne få til at makke ret. Anders var her ofte plageånden, hvis egne drillerier kom tilbage som en boomerang. - -Fjernsynets fremmarch i 1950'erne satte snart stopper for de korte tegnefilm, og Jack Hannah blev sat til at redigere Disneys tv-shows og kæde de korte tegnefilm sammen i et længere forløb. Her blev Anders gjort mere sympatisk, men det var eksperten i alt, Raptus von And, der gjorde mest for tv-showet. I et andet tv-show Disney Sjov medvirkede Anders i tv-serierne Rip, Rap og Rup på eventyr, Bonkers, og Rap Sjak. I Rip, Rap og Rup på eventyr, var han sjældent med, men fik et nyt tøj. I Rap Sjak var hans matrostøj skiftet ud med en hawaii-skjorte med røde og hvide blomster. I Bonkers var han også med kort tid. - -Anders And gik til tegneserien allerede tidligt efter sin debut i 1934, hvor han i avisstriber optrådte med sin makker fra "The Wise Little Hen," Peter Gris. Fra den 10. februar 1935 blev han en del af Mickeys avisstribe som musens kujonagtige og drillesyge ven, men fra 1936 kaprede han hovedrollen i Silly Symphony-striben. Forfatteren Ted Osborne og tegneren Al Taliaferro, der stod bag serieudgaven af The Wise Little Hen, pressede på, og da det blev en succes kunne forfatteren Bob Karp i samarbejde med Taliaferro lave andens egen avisstribe. - -Det blev en populær serie. I de allertidligste serier var Anders en hidsig, ondskabsfuld og pueril and med langt spidst næb og hænder, der knap kunne skelnes fra vinger. Senere blev han mere voksen, da han fik ansvaret for sine tre nevøer Rip, Rap og Rup, og kæresten Andersine kom til sammen med Bedstemor And. - -Tegneseriefiguren Anders And blev senere udviklet yderligere af Carl Barks. I de tidlige tegnefilm var han for det meste doven og hidsig; men for at gøre hans figur brugbar til en tegneserie besluttede Barks at udvide hans personlighed. Anders' mest gennemgående karaktertræk er hans notoriske uheld, som desuden har den narrative funktion at give adgang til spændende eventyr, uden at serien udvikler sig for meget. På denne måde kan Anders eksempelvis blive involveret i alverdens skattejagter, og da han altid ender med at miste den fundne gevinst, kan alle historierne starte fra samme udgangspunkt. - -For at give Anders en verden at bo i, skabte Barks byen Andeby i den amerikanske stat Calisota (som er en blanding af de to amerikanske stater Californien og Minnesota) med indbyggere som den rige onkel Joakim von And, den heldige Fætter Højben og den dygtige opfinder Georg Gearløs. - -Anders lægger med sit engelske navn Donald Duck i øvrigt navn til donaldismen, fankulturen omkring Disney-tegneserier og -tegnefilm, som den norske forfatter Jon Gisle udviklede med sin bog af samme navn. - -Anders bor i Andeby på Paradisæblevej 111 med sine tre nevøer Rip, Rap og Rup. De er stort set identiske, men de kan i nogle historier identificeres på, hvilken farve kasket de har på. - -Ifølge Disneytegneserieforfatteren Don Rosa var Anders født et eller andet sted omkring 1920 men dette er "ikke" officielt. Ifølge Carl Barks' stamtræ (senere udviklet og genbygget af Don Rosa for den danske udgiver Egmont Serieforlaget) er Anders' forældre Hortensia von And og Rapmus And. Anders har en søster ved navn Della And, men hverken hun eller Anders' forældre optræder i tegnefilmene eller tegneserierne bortset fra særlige steder som eksempelvis i Her er dit liv, Joakim. Ifølge Don Rosa er Anders og Della tvillinger. - -Fra tegnefilmen "Mr. Duck Steps Out" har Anders' kæreste været Andersine And, men han går i stadig fare for at miste hende til den heldige Fætter Højben. I nogle italienske historier er Anders også superhelt under dæknavnet "Stålanden". - -Anders' onkel, Joakim von And, er den rigeste and i verden. - -Sammen med onkelen og nevøerne Rip, Rap og Rup har Anders And rejst jorden rundt til mange forskellige lande og steder. Blandt disse er landet Langtbortistan, hvis navn blev opfundet af den danske oversætter Sonja Rindom og senere er gledet ind i almindeligt, dansk sprogbrug. - -I de tidlige historier af Carl Barks havde Anders en hale, der stak langt bagud. Han havde langt næb og lang hals, og hans matrostrøje havde fire knapper. Hans lange hals passede godt til egenskaben nysgerrighed og det lange næb til hans hidsighed, hvilket var to egenskaber, der prægede ham mest. Disse tidlige historier var også præget af en grov komik i stil med tegnefilmene. - -Siden fik han et mere strømlinet udseende og kortere næb (dog ikke så kort som visse tegnere i 1960'erne gjorde det!) og kun to knapper på trøjen, et udseende de øvrige andetegnere også tager til sig. Her blev hans natur også mere sammensat, og han ligner mest af alt en tragisk helt. Komikken kommer mere og mere til at ligge i replikkerne. - -Anders And optræder særligt i jumbobøgerne med en hemmelig identitet i form af superhelten Stålanden. Figuren er inspireret af Batman og er skabt af den italienske forfatter Guido Martina i samarbejde med kunstneren Giovan Battista Carpi i 1969 i hans italienske navn Paperinik. Ofte tegnet af Romano Scarpa. - -I lighed med inspirationskilden er han maskeret og har et hav af tekniske opfindelser, som han bruger i kamp mod forbryderne og overvejende! i kamp for at redde sit andet jeg, Anders And, ud af kniben. Den eneste, som kender hans hemmelige identitet, er opfinderen Georg Gearløs, som har udstyret gamle 313 med moderne udstyr og finurligheder. Det er ikke så tit at Stålanden optræder; næsten kun i Jumbobøger, men har dog også optrådt i Anders And-bladene med en gæstehistorie, hvor Stålanden kæmper mod en tidligere fjende, som nu havde kaldt sig Lord Hvalros. - -Efter at Stålanden i starten af 1990'erne ikke var benyttet så meget af historieskriverne, forsvandt han næsten ud af Disney-universet indtil 1996, hvor en ny serie, "Stålanden på nye eventyr", startede med Stålanden i hovedrollen (umiddelbart inspireret af Marvel universet). Denne relancering af Stålanden gav karakteren det ekstra, der skulle til for at få et godt comeback. - -I modsætning til størstedelen af Anders And-tegneserier har denne serie en sammenhængende forløb. I serien optræder kun sjældent de andre figurer fra de normale Anders And tegneserier; oftest er det kun en kort birolle eller en reference, men til gengæld er en mængde nye figurer kommet til. - -Serien starter med, at Anders And er ansat som vicevært i Ducklair Tower, et højhus bygget af mangemilliardæren Everett Ducklair, en fremragende videnskabsmand og opfinder, som forlod Andeby og drog til et tibetansk kloster, Dhasam-Bul. Anders finder Globus, en kunstig intelligens skabt af Ducklair, samt Ducklair's arsenal af våben og opfindelser. Dette bliver starten på Anders' liv som Stålanden. -En mængde temaer var ofte i centrum for historierne, bl.a. tidsrejser og Tidspolitiets kamp med tidspiraterne fra Organisationen, invasion fra rummet af de magtsyge evronianere, Stålandens samarbejde med FBI og meget mere. - -Serien fik en fornyelse i 2001, hvilket ændrede markant på historierne. Everett Ducklair vender tilbage, slukker Globus, smider Stålanden ud af Ducklair Tower og genopretter sit gamle imperium. Undervejs bliver Ducklair's to døtre afsløret. De hader begge Everett af grunde, der ikke bliver afsløret til fulde, selvom det bliver antydet, at Everett skilte sig af med deres mor på en eller anden måde. -Denne fornyelse holdt 18 numre, før serien blev afsluttet, dog uden at historierne fik en slutning. - -Barks-historien "Anders And og den gyldne hjelm" fra 1954 kom i 2006 med i '''; diff --git a/benchmarks/Utf8Decode/dart2/entext_ascii_10k.dart b/benchmarks/Utf8Decode/dart2/entext_ascii_10k.dart deleted file mode 100644 index d7da461074d..00000000000 --- a/benchmarks/Utf8Decode/dart2/entext_ascii_10k.dart +++ /dev/null @@ -1,37 +0,0 @@ -// This text is an extract from the English Wikipedia article about Anarchism: -// https://en.wikipedia.org/wiki/Anarchism -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String en = ''' -Anarchism - -Anarchism is a radical political movement that is highly skeptical towards authority and rejects all forms of unjust hierarchy. It calls for the abolition of the state which it holds to be undesirable, unnecessary, and harmful. Anarchism advocates for the replacement of the state with stateless societies or other forms of free associations. - -Anarchism's timeline stretches back to prehistory when people lived in anarchistic societies long before the establishment of formal states, kingdoms or empires. With the rise of organised hierarchical bodies, skepticism towards authority also rose, but it was not until the 19th century a self-conscious political movement was formed. During the latest half of 19th and the first decades of 20th century, the anarchist movement flourished to most parts of the world, and had a significant role in worker's struggles for emancipation. Various branches of anarchism were espoused during those times. Anarchists took part in several revolutions, most notably in the Spanish Civil War, where they were crushed by the fascists forces in 1939, marking the end of the classical era of anarchism. In the latest decades of the 20th century, the anarchist movement nonetheless became relevant and vivid once more. - -Anarchism employ various tactics in order to meet their ideal ends; these can be broadly separated in revolutionary and evolutionary tactics. There is significant overlap between the two legs which are merely descriptive. Revolutionary tactics aim to bring down authority and state, and have taken a violent turn in the past. Evolutionary tactics aim to prefigure what an anarchist society would be like. Anarchism's thought, criticism and praxis has played a part in diverse fields of human society. - -The etymological origin of the word "anarchism" is from the ancient Greek word "anarkhia", meaning "without a ruler", composed of the prefix "an-" (i.e. "without") and the word "arkhos" (i.e. "leader" or "ruler"). The suffix -ism denotes the ideological current that favours anarchy. The word "anarchism" appears in English from 1642 as "anarchisme" and the word "anarchy" from 1539. Various factions within the French Revolution labelled their opponents as "anarchists", although few such accused shared many views with later anarchists. Many revolutionaries of the 19th century such as William Godwin (17561836) and Wilhelm Weitling (18081871) would contribute to the anarchist doctrines of the next generation, but they did not use the word "anarchist" or "anarchism" in describing themselves or their beliefs. - -The first political philosopher to call himself an "anarchist" () was Pierre-Joseph Proudhon (18091865), marking the formal birth of anarchism in the mid-19th century. Since the 1890s and beginning in France, the term "libertarianism" has often been used as a synonym for anarchism and its use as a synonym is still common outside the United States. On the other hand, some use "libertarianism" to refer to individualistic free-market philosophy only, referring to free-market anarchism as libertarian anarchism. - -While opposition to the state is central to anarchist thought, defining anarchism is not an easy task as there is a lot of talk among scholars and anarchists on the matter and various currents perceive anarchism slightly differently. Hence, it might be true to say that anarchism is a cluster of political philosophies opposing authority and hierarchical organization (including the state, capitalism, nationalism and all associated institutions) in the conduct of all human relations in favour of a society based on voluntary association, on freedom and on decentralisation, but this definition has the same shortcomings as the definition based on etymology (which is simply a negation of a ruler), or based on anti-statism (anarchism is much more than that) or even the anti-authoritarian (which is an "a posteriori" conclusion). Nonetheless, major elements of the definition of anarchism include the following: - -During the prehistoric era of mankind, an established authority did not exist. It was after the creation of towns and cities that institutions of authority were established and anarchistic ideas espoused as a reaction. Most notable precursors to anarchism in the ancient world were in China and Greece. In China, philosophical anarchism (i.e the discussion on the legitimacy of the state) was delineated by Taoist philosophers Zhuangzi and Lao Tzu. Likewise, anarchic attitudes were articulated by tragedians and philosophers in Greece. Aeschylus and Sophocles used the myth of Antigone to illustrate the conflict between rules set by the state and personal autonomy. Socrates questioned Athenian authorities constantly and insisted to the right of individual freedom of consciousness. Cynics dismissed human law ("nomos") and associated authorities while trying to live according to nature ("physis"). Stoics were supportive of a society based on unofficial and friendly relations among its citizens without the presence of a state. - -During the Middle Ages, there was no anarchistic activity except some ascetic religious movements in the Islamic world or in Christian Europe. This kind of tradition later gave birth to religious anarchism. In Persia, Mazdak called for an egalitarian society and the abolition of monarchy, only to be soon executed by the king. In Basra, religious sects preached against the state. In Europe, various sects developed anti-state and libertarian tendencies. Libertarian ideas further emerged during the Renaissance with the spread of reasoning and humanism through Europe. Novelists fictionalised ideal societies that were based not on coercion but voluntarism. The Enlightenment further pushed towards anarchism with the optimism for social progress. - -During the French Revolution, the partisan groups of Enrags and saw a turning point in the fermentation of anti-state and federalist sentiments. The first anarchist currents developed throughout the 18th centuryWilliam Godwin espoused philosophical anarchism in England, morally delegitimizing the state, Max Stirner's thinking paved the way to individualism, and Pierre-Joseph Proudhon's theory of mutualism found fertile soil in France. This era of classical anarchism lasted until the end of the Spanish Civil War of 1936 and is considered the golden age of anarchism. -Drawing from mutualism, Mikhail Bakunin founded collectivist anarchism and entered the International Workingmen's Association, a class worker union later known as the First International that formed in 1864 to unite diverse revolutionary currents. The International became a significant political force, and Karl Marx a leading figure and a member of its General Council. Bakunin's faction, the Jura Federation and Proudhon's followers, the mutualists, opposed Marxist state socialism, advocating political abstentionism and small property holdings. After bitter disputes the Bakuninists were expelled from the International by the Marxists at the 1872 Hague Congress. Bakunin famously predicted that if revolutionaries gained power by Marxist's terms, they would end up the new tyrants of workers. After being expelled, anarchists formed the St. Imier International. Under the influence of Peter Kropotkin, a Russian philosopher and scientist, anarcho-communism overlapped with collectivism. Anarcho-communists, who drew inspiration from the 1871 Paris Commune, advocated for free federation and distribution of goods according to one's needs. - -At the turning of the century, anarchism had spread all over the world. In China, small groups of students imported the humanistic pro-science version of anarcho-communism. Tokyo was a hotspot for rebellious youth from countries of the far east, pouring into the Japanese capital to study. In Latin America, So Paulo was a stronghold for anarcho-syndicalism where it became the most prominent left-wing ideology. During this time, a minority of anarchists adopted tactics of revolutionary political violence. This strategy became known as propaganda of the deed. The dismemberment of the French socialist movement into many groups and the execution and exile of many Communards to penal colonies following the suppression of the Paris Commune favoured individualist political expression and acts. Even though many anarchists distanced themselves from these terrorist acts, infamy came upon the movement. Illegalism was another strategy which some anarchists adopted these same years. -Anarchists enthusiastically participated in the Russian Revolutiondespite concernsin opposition to the Whites. However, they met harsh suppression after the Bolshevik government was stabilized. Several anarchists from Petrograd and Moscow fled to Ukraine, notably leading to the Kronstadt rebellion and Nestor Makhno's struggle in the Free Territory. With the anarchists being crushed in Russia, two new antithetical currents emerged, namely platformism and synthesis anarchism. The former sought to create a coherent group that would push for the revolution while the latter were against anything that would resemble a political party. Seeing the victories of the Bolsheviks in the October Revolution and the resulting Russian Civil War, many workers and activists turned to communist parties which grew at the expense of anarchism and other socialist movements. In France and the United States, members of major syndicalist movements, the General Confederation of Labour and Industrial Workers of the World, left their organisations and joined the Communist International. - -In the Spanish Civil War, anarchists and syndicalists (CNT and FAI) once again allied themselves with various currents of leftists. A long tradition of Spanish anarchism led to anarchists playing a pivotal role in the war. In response to the army rebellion, an anarchist-inspired movement of peasants and workers, supported by armed militias, took control of Barcelona and of large areas of rural Spain where they collectivised '''; diff --git a/benchmarks/Utf8Decode/dart2/netext_3_10k.dart b/benchmarks/Utf8Decode/dart2/netext_3_10k.dart deleted file mode 100644 index 1538945d06f..00000000000 --- a/benchmarks/Utf8Decode/dart2/netext_3_10k.dart +++ /dev/null @@ -1,26 +0,0 @@ -// This text is an extract from the Nepali Wikipedia article about Nepal -// (नेपाल): https://ne.wikipedia.org/wiki/नेपाल -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String ne = ''' -नेपाल - -नेपाल (आधिकारिक नाम: सङ्घीय लोकतान्त्रिक गणतन्त्र नेपाल) दक्षिण एसियाली भूपरिवेष्ठित हिमाली राष्ट्र हो । यसको भौगोलिक अक्षांश २६ डिग्री २२ मिनेटदेखि ३० डिग्री २७ मिनेट उत्तर र ८० डिग्री ४ मिनेटदेखि ८८ डिग्री १२ मिनेट पूर्वी देशान्तरसम्म फैलिएको छ । यसको कूल क्षेत्रफल १,४७,१८१ वर्ग कि.मि छ । यो क्षेत्रफल पृथ्वीको कूल क्षेत्रफलको ०.०३% र एसिया महादेशको ०.३% पर्दछ । लण्डन स्थित "ग्रीनवीच मिनटाइम" भन्दा पूर्वतर्फ रहेकोले गौरीशङ्कर हिमालको नजिक भएर जाने ८६ डिग्री १५ मिनेट पूर्वी देशान्तरलाई आधार मानी नेपालको प्रमाणिक समय ५ घण्टा ४५ मिनेट आगाडि मानिएको छ । - -नेपालको पूर्वी सीमाना मेची नदीदेखि पश्चिमी सीमाना महाकाली नदीसम्मको औसत लम्वाई ८८५ कि.मि. छ । उत्तरदेखि दक्षिणको चौडाई भने एकनासको छैन । पूर्वी भागभन्दा पश्चिमी भाग केही चौडा छ । त्यस्तै मध्य भाग भने केही खुम्चिएको छ । यसमा अधिकतम चौडाई २४१ कि.मि. र न्यूनतम चौडाई १४५ कि.मि. रहेको छ । यसर्थ नेपालको औसत चौडाई १९३ कि.मि. रहेको छ । नेपालको उत्तरमा चीनको स्वशासित क्षेत्र तिब्बत पर्दछ भने दक्षिण, पूर्व र पश्चिममा भारत पर्दछ । नेपालका ८०% भन्दा बढी नागरिक हिन्दू धर्म मान्दछन् जुन विश्वकै सबैभन्दा बढी प्रतिशत हिन्दू धर्मावलम्बी हुने राष्ट्र पनि हो । यसबाहेक बौद्ध, इस्लाम, किराॅत आदि धर्म मान्ने मानिसहरू पनि यहाँ बसोबास गर्दछन् । एउटा सानो क्षेत्रको लागि नेपालको भौगोलिक विविधता निकै उल्लेखनीय छ । यहाँ तराईका उष्ण फाँटदेखि चिसा हिमालयका शृंखला अवस्थित छन् । संसारका सबैभन्दा उच्च १४ हिमश्रृंखलाहरु मध्ये ८ वटा नेपालमा पर्दछन्, जसमध्ये संसारको सर्वोच्च शिखर सगरमाथा (नेपाल र चीनको सीमानामा पर्ने) पनि एक हो । नेपालको प्रमुख सहर एवं राजधानी काठमाडौं हो । काठमाडौं, ललितपुर र भक्तपुर सहरहरूलाई काठमाडौं उपत्यका भनेर चिनिन्छ । अन्य प्रमुख सहरहरूमा भरतपुर, बिराटनगर, भैरहवा, वीरगञ्ज, जनकपुर, पोखरा, नेपालगञ्ज, धनगढी र महेन्द्रनगर पर्दछन् । - -नेपाल शब्दको उत्त्पत्ति बारेमा ठोस प्रमाण त उपलब्ध छैन, तर एक प्रसिद्ध विश्वास अनुसार मरिची ॠषि पुत्र 'ने' मुनिले पालन गरेको ठाउँको रूपमा यहाँको नाम नेपाल रहन गएको हो । निरन्तर रूपमा राजा-रजौटाहरूको अधीनमा रहेर फुट्ने र जुट्ने लामो तथा सम्पन्न इतिहास बोकेको, अहिले नेपाल भनेर चिनिने यो खण्डले वि. सं. २०४६ सालको आन्दोलन पश्चात् संवैधानिक राजतन्त्रको नीति अवलम्बन गर्‍यो । तर यस पश्चात् पनि राजसंस्था एक महत्त्वपूर्ण तथा अस्पष्ट परिधि तथा शक्ति भएको संस्थाको रूपमा रहिरह्यो । यो व्यवस्थामा पहिले संसदीय अनिश्चितता तथा सन् १९९६ देखि ने.क.पा.(माओवादी)को जनयुद्धको कारणले राष्ट्रिय अनिश्चितता देखियो । - -माओवादीहरूले राजनीतिको मूलाधारबाट अल्लगिएर भूमिगत रूपमा राजतन्त्र तथा मूलाधारका राजनीतिक दलहरूको विरुद्धमा गुरिल्ला युद्ध सञ्चालन गरे, जसको कारण १३,००० भन्दा बढी मानिसहरूको ज्यान जान पुग्यो । यही विद्रोहलाई दमन गर्ने पृष्ठभूमिमा राजाले सन् २००२ मा संसदको विघटन गरी निर्वाचित प्रधानमन्त्रीलाई अपदस्त गरेर प्रधानमन्त्री मनोनित गर्दै शासन चलाउन थाले । सन् २००५ मा उनले एकनासै संकटकालको घोषणा गरेर सबै कार्यकारी शक्ति ग्रहण गरे। सन् २००६को लोकतान्त्रिक आन्दोलन (जनाअन्दोलन-२) पश्चात् राजाले देशको सार्वभौमसत्ता जनतालाई हस्तान्तरण गरे तथा अप्रिल २४, २००६ मा भंग गरिएको संसद पूनर्स्थापित भयो । मे १८, २००६ मा आफूले पाएको सार्वभौमसत्ताको उपयोग गर्दै नयाँ प्रतिनिधि सभाले राजाको अधिकारमा कटौती गर्‍यो तथा नेपाललाई एक धर्मनिरपेक्ष राष्ट्र घोषणा गर्‍यो । अन्तरिम व्यवस्थापिका संसदले पहिले नै घोषणा गरिसकेको "सङ्घीय लोकतान्त्रिक गणराज्य, संविधानसभा" को पहिलो बैठकबाट मे २८, २००८ मा आधिकारिक रूपमा कार्यान्वयन भयो । नेपालको भूगोल सानो भए पनी नेपालीहरु को मन ठुलो छ । - -हिमालय क्षेत्रमा मानिसहरू बस्न थालेको कम्तिमा पनि ९,००० वर्ष भएको कुरा काठमाडौं उपत्यकामा पाइएका प्राचीन औजारहरूबाट पुष्टि हुन्छ। सम्भवत: भोट-बर्मेली मूलका मानिसहरू नेपालमा २,५०० वर्ष अगाडि बसोबास गर्दथे। - -ईशापूर्व १५०० तिर इन्डो-आर्यन जातिहरू उपत्यका प्रवेश गरे। ईशापूर्वको १००० तिर स-साना राज्यहरू र राज्यसङ्गठनहरू बने। सिद्धार्थ गौतम (ईशापूर्व ५६३–४८३) त्यस्तै एक वंश, शाक्यवंशका राजकुमार थिए, जसले आफ्नो राजकाज त्यागी तपस्वीको जीवन अँगाले र उनी बुद्ध भनेर विश्व प्रसिद्ध भए। -ईशापूर्वको २५० सम्ममा, यो क्षेत्र उत्तर'''; diff --git a/benchmarks/Utf8Decode/dart2/rutext_2_10k.dart b/benchmarks/Utf8Decode/dart2/rutext_2_10k.dart deleted file mode 100644 index 55295d7b487..00000000000 --- a/benchmarks/Utf8Decode/dart2/rutext_2_10k.dart +++ /dev/null @@ -1,46 +0,0 @@ -// This text is an extract from the Russian Wikipedia article about Lithuania -// (Литва): https://ru.wikipedia.org/wiki/Литва -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String ru = ''' -Литва - -Литва́ (), официальное название Лито́вская Респу́блика () государство, расположенное в северной части Европы. Столица страны Вильнюс. - -Площадь км². Протяжённость с севера на юг 280 км, а с запада на восток 370 км. Население составляет человек (сентябрь, 2019). Занимает 140-е место место в мире по численности населения и 121-е по территории. Имеет выход к Балтийскому морю, расположена на его восточном побережье. Береговая линия составляет всего 99 км (наименьший показатель среди государств Балтии). На севере граничит с Латвией, на юго-востоке с Белоруссией, на юго-западе с Польшей и Калининградской областью России. - -Член ООН с 1991 года, ЕС и НАТО с 2004 года, ОЭСР с мая 2018 года. Входит в Шенгенскую зону и Еврозону. - -Независимость страны провозглашена 11 марта 1990 года, а юридически оформлена 6 сентября 1991 года. . - -Этимология слова «Литва» точно не известна, при этом существует множество версий, ни одна из которых не получила всеобщего признания. Корень «лит» и его варианты «лет»/«лют» допускают различные толкования как в балтских и славянских, так и в других индоевропейских языках. Так, например, существуют созвучные топонимы на территории Словакии «"Lytva"» и Румынии «"Litua"», известные с XIXII веков. По мнению Е. Поспелова, топоним образован от древнего названия реки Летава (Lietavà от «лить», русское «Летаука»). Феодальное княжество, по землям которого протекала эта река, со временем заняло ведущее положение и название было распространено на всё государство. В «Повести временных лет» (XII век) упоминается этноним «литва», полностью совпадающий с названием местности «Литва» и по смыслу (территория, где живёт литва), и по форме. - -Поверхность  равнинная со следами древнего оледенения. Поля и луга занимают 57 % территории, леса и кустарники  30 %, болота  6 %, внутренние воды  1 %. - -Высшая точка  293,84 м над уровнем моря  холм Аукштояс (или Аукштасис калнас) в юго-восточной части страны, в 23,5 км от Вильнюса. - -Крупнейшие реки  Неман и Вилия. -Более 3 тыс. озёр (1,5 % территории): крупнейшее из них  Друкшяй на границе Латвии, Литвы и Белоруссии (площадь 44,8 км²), самое глубокое  Таурагнас, 61 м), самое длинное  Асвея длинной в 30 км у местечка Дубингяй. - -Климат переходный от морского к континентальному. Средняя температура зимой 5 °C, летом +17 °C. Выпадает 748 мм осадков в год. - -Полезные ископаемые: торф, минеральные материалы, строительные материалы. - -Территория современной Литвы была заселена людьми с конца XIX тысячелетия до н. э. Жители занимались охотой и рыболовством, использовали лук и стрелы с кремнёвыми наконечниками, скребки для обработки кожи, удочки и сети. В конце неолита (IIIII тысячелетия до н. э.) на территорию современной Литвы проникли индоевропейские племена. Они занимались земледелием и скотоводством, при этом охота и рыболовство оставались основными занятиями местных жителей вплоть до широкого распространения железных орудий труда. Индоевропейцы, заселившие земли между устьями Вислы и Западной Двины, выделились в отдельную группу, названную учёными балтами. - -Традиционно считается, что этническая основа Литвы сформирована носителями археологической культуры восточнолитовских курганов, сложившейся в V веке н. э. на территории современных Восточной Литвы и Северо-Западной Белоруссии. Около VII века литовский язык отделился от латышского. - -Становление государственности на территории современной Литвы относят к XIII веку, при этом само название «Литва» впервые упомянуто в Кведлинбургских анналах под 1009 годом в сообщении об убийстве язычниками миссионера Бруно на границе Руси и Литвы. По наиболее распространённой версии, топоним возник от названия небольшой реки Летаука, притока Няриса. Согласно более современной гипотезе, название страны могло произойти от этнонима «леты» или «лейти», которым жители окрестных земель называли дружинников литовских князей. - -В начале XIII века в земли балтов-язычников с запада началось вторжение немецких рыцарей-крестоносцев. Они покорили Пруссию и Ливонию. В это же время с юга началась экспансия Галицко-Волынского княжества. К середине XIII века многие литовские земли были объединены под властью князя Миндовга, принявшего в 1251 году католическое крещение и коронованного в 1253 году. Через несколько лет Миндовг отрёкся от христианства и до начала XIV века литовские земли оставались языческими. Несмотря на то, что уже в 1263 году Миндовг был свергнут, его правление положило начало более чем пятисотлетнему существованию Великого княжества Литовского. - -В XIV  начале XV веках территория Великого княжества Литовского стремительно росла, в основном за счёт присоединения земель Западной Руси. Включение в состав государства славянских земель, многократно превышающих по площади и количеству населения собственно литовские земли, привело к перениманию литовскими князьями, получившими во владение русские земли, православной культуры и западнорусского языка. Со временем западнорусский язык стал официальным языком канцелярии великих князей. Собственно литовский язык до XVI века оставался бесписьменным, хотя и продолжал использоваться на этнически литовских землях. - -В 1385 году великий князь литовский Ягайло заключил Кревскую унию с Королевством Польским. По условиям унии, Ягайло обязался присоединить Великое княжество Литовское к Королевству Польскому и крестить литовские земли по католическому обряду, а сам становился королём Польши и сохранял титул великого князя литовского. Однако вскоре он вынужден был уступить власть в Великом княжестве Литовском своему двоюродному брату Витовту.'''; diff --git a/benchmarks/Utf8Decode/dart2/sktext_10k.dart b/benchmarks/Utf8Decode/dart2/sktext_10k.dart deleted file mode 100644 index 198c2743858..00000000000 --- a/benchmarks/Utf8Decode/dart2/sktext_10k.dart +++ /dev/null @@ -1,48 +0,0 @@ -// This text is an extract from the Slovak Wikipedia article about Esperanto: -// https://sk.wikipedia.org/wiki/Esperanto -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String sk = ''' -Esperanto (pôvodne Lingvo Internacia – „medzinárodný jazyk“) je najrozšírenejší medzinárodný plánový jazyk. Názov je odvodený od pseudonymu, pod ktorým v roku 1887 zverejnil lekár L. L. Zamenhof základy tohto jazyka. Zámerom tvorcu bolo vytvoriť ľahko naučiteľný a použiteľný neutrálny jazyk, vhodný na použitie v medzinárodnej komunikácii. Cieľom nebolo nahradiť národné jazyky, čo bolo neskôr aj deklarované v Boulonskej deklarácii. - -Hoci žiaden štát neprijal esperanto ako úradný jazyk, používa ho komunita s odhadovaným počtom hovoriacich 100 000 až 2 000 000, z čoho približne 2 000 tvoria rodení hovoriaci. V Poľsku je na zozname nemateriálneho kultúrneho dedičstva. Získalo aj isté medzinárodné uznania, napríklad dve rezolúcie UNESCO či podporu známych osobností verejného života. V súčasnosti sa esperanto využíva pri cestovaní, korešpondencii, medzinárodných stretnutiach a kultúrnych výmenách, kongresoch, vedeckých diskusiách, v pôvodnej aj prekladovej literatúre, divadle a kine, hudbe, tlačenom aj internetovom spravodajstve, rozhlasovom a televíznom vysielaní. - -Slovná zásoba esperanta pochádza predovšetkým zo západoeurópskych jazykov, zatiaľ čo jeho skladba a tvaroslovie ukazujú na silný slovanský vplyv. Morfémy sú nemenné a je možné ich kombinovať takmer bez obmedzení do rozmanitých slov; esperanto má teda mnoho spoločného s analytickými jazykmi, ako je čínština, zatiaľ čo vnútorná stavba jeho slov pripomína jazyky aglutinačné, ako je japončina, swahilčina alebo turečtina. - -Pri zrode esperanta stál Ludwik Lejzer Zamenhof. Vyrastal v mnohojazyčnom, vtedy ruskom, teraz poľskom meste Białystok, kde bol svedkom častých sporov medzi jednotlivými národnosťami (Rusi, Poliaci, Nemci, Židia). Pretože za jednu z hlavných príčin týchto sporov považoval neexistenciu spoločného jazyka, začal už ako školák pracovať na projekte reči, ktorá by túto funkciu mohla plniť. Mala byť, na rozdiel od národných jazykov, neutrálna a ľahko naučiteľná, teda prijateľná ako druhý jazyk pre všetkých, jazyk vyučovaný spoločne s národnými jazykmi a používaný v situáciách vyžadujúcich dorozumenie medzi národmi. - -Zamenhof najskôr uvažoval o oživení latinčiny, ktorú sa učil v škole, ale usúdil, že je pre bežné dorozumievanie zbytočne zložitá. Keď študoval angličtinu, všimol si, že časovanie slovies podľa osoby a čísla nie je nutné; že gramatický systém jazyka môže byť oveľa jednoduchší, než sa dovtedy nazdával. Stále však zostávala prekážka v memorovaní sa veľkého množstva slov. Raz Zamenhofa zaujali dva ruské nápisy: "швейцарская" [švejcarskaja] (vrátnica, odvodené od "швейцар" [švejcar] – vrátnik) a "кондитерская" [konditerskaja] (cukráreň, odvodené od "кондитер" [konditér] – cukrár). Tieto slová rovnakého zakončenia mu vnukli myšlienku, že používanie pravidelných predpôn a prípon by mohlo významne znížiť množstvo slovných koreňov nutných na dorozumenie sa. Aby boli korene čo najmedzinárodnejšie, rozhodol sa prevziať slovnú zásobu predovšetkým z románskych a germánskych jazykov, teda tých, ktoré boli vtedy v školách po celom svete vyučované najčastejšie. -Prvý Zamenhofov projekt, nazvaný "Lingwe uniwersala," bol viac-menej hotový už v roku 1878, ale autorov otec, učiteľ jazykov, považoval túto prácu za márnu a utopistickú, a zrejme preto rukopis, ktorý mu bol zverený, zničil. V rokoch 1879 – 1885 Zamenhof študoval medicínu v Moskve a vo Varšave. V tej dobe začal znova pracovať na medzinárodnom jazyku. Prvú obnovenú verziu vyučoval v roku 1879 pre svojich priateľov. Po niekoľkých rokoch už prekladal poéziu, aby jazyk čo najviac zdokonalil. V roku 1885 autor napísal: - -Zamenhofovi prichádzalo veľa nadšených listov, ktoré často prinášali najrôznejšie návrhy úprav jazyka. Všetky podnety zaznamenával a neskoršie ich začal uverejňovať v časopise "Esperantisto", vychádzajúcom v Norimbergu. V tom istom časopise aj dal o úpravách dvakrát hlasovať, väčšina čitateľov však so zmenami nesúhlasila. Po týchto hlasovaniach na určitý čas utíchli hlasy volajúce po reforme a jazyk sa začal rozširovať. Najviac odberateľov mal časopis vo vtedajšom Rusku. Veľkou ranou preň bolo, keď ruská cenzúra jeho šírenie zakázala kvôli článku Leva Nikolajeviča Tolstého. Časopis kvôli tomu musel byť zrušený, krátko na to bol však vystriedaný novým, nazvaným "Lingvo Internacia." Najskôr ho redigovali vo švédskej Uppsale, neskôr v Maďarsku a nakoniec v Paríži, kde jeho vydávanie zastavila až prvá svetová vojna. - -Nový medzinárodný jazyk začali jeho používatelia skoro používať aj na organizáciu odbornej a záujmovej činnosti na medzinárodnej úrovni. V prvých desaťročiach prebiehala komunikácia v esperante takmer výhradne písomnou formou. Ale po nečakane úspešnom prvom Svetovom kongrese esperanta, usporiadanom v roku 1905 vo francúzskom meste Boulogne-sur-Mer, na ktorom sa overili možnosti používania tejto reči v hovorenej forme, začali naberať na intenzite aj osobné kontakty. - -Esperanto začali pre svoju činnosť používať aj rôzne organizácie a hnutia. Už na svetovom kongrese v Barcelone roku 1909 sa uskutočnilo niekoľko stretnutí prítomných katolíkov, ktorí sa nakoniec rozhodli usporiadať v nadchádzajúcom roku, 1910, samostatný kongres katolíckych esperantistov. Počas neho bolo založené Medzinárodné združenie katolíckych esperantistov (IKUE – Internacia Katolika Unuiĝo Esperantista). Časopis "Espero Katolika" ("Katolícka nádej") vychádzal už od roku 1903 a s viac ako 100 rokmi svojej existencie je dnes najdlhšie vychádzajúcim esperantským periodikom. - -V roku 1912 sa Zamenhof pri slávnostnom prejave ôsmeho Svetového kongresu esperanta v Krakove vzdal svojej oficiálnej úlohy v hnutí. Desiaty kongres sa mal konať v roku 1914 v Paríži, prihlásilo sa naň takmer 4 000 ľudí, ale nakoniec ho zrušili pre začínajúcu vojnu, Zamenhof sa vtedy musel vrátiť domov cez škandinávske štáty. - -Po vojne túžba po harmónii a mieri vzbudila nové nádeje, vďaka čomu sa esperanto veľmi rýchlo šírilo. Prvý povojnový kongres sa konal v roku 1920 v Haagu, 13. svetový kongres v 1921 v Prahe. V roku 1927 bolo vo viedenskom Hofburgu otvorené Medzinárodné esperantské múzeum, v roku 1929 bolo pripojené k Rakúskej národnej knižnici a dnes sídli v samostatnej budove. - -Snahy o presadenie esperanta ako univerzálneho jazyka sa stretávali s pozitívnou odozvou: Petíciu v jeho prospech adresovanú Organizácii Spojených národov podpísalo vyše 80 miliónov ľudí, v Česko-Slovensku napríklad prof. Jaroslav Heyrovský, nositeľ Nobelovej ceny. - -Valné zhromaždenie UNESCO prijalo podobné rezolúcie v Montevideu 10. decembra 1954 a v Sofii 8. novembra 1985. Vzalo v nich na vedomie "výsledky dosiahnuté esperantom na poli medzinárodnej duchovnej výmeny aj zblíženia národov sveta" a vyzvalo členské štáty, "aby sa chopili iniciatívy pri zavádzaní študijných programov o jazykovom probléme a esperante na svojich školách a inštitúciách vyššieho vzdelávania". - -K esperantu sa hlásila aj rada predsedov Poľskej akadémie vied. Jubilejného 72. Svetového kongresu esperanta roku 1987 (100. výročie uverejnenia prvej učebnice jazyka) sa vo Varšave zúčastnilo takmer 6 000 ľudí zo 60 národov. - -Pokroky dosiahli aj katolícki esperantisti – roku 1990 bol vydaný dokument "Norme per la celebrazione della Messa in esperanto", ktorým Svätá stolica povoľuje vysluhovať sväté omše v tomto jazyku bez zvláštneho povolenia. Esperanto sa tak stalo jediným schváleným umelým liturgickým jazykom katolíckej cirkvi. - -Skutočnosť, že mnohé z cieľov esperantského hnutia sa doteraz nepodarilo naplniť, je často prisudzovaná okrem iného technologickej a kultúrnej dominancii Spojeného kráľovstva a Spojených štátov amerických, predovšetkým v období po druhej svetovej vojne, vďaka čomu je v súčasnosti dorozumievacím jazykom väčšiny medzinárodných činností angličtina. - -Už na začiatku 20. storočia bolo na území dnešného Slovenska (vtedy severná časť Uhorska) činné esperantské hnutie. Esperantistov a kluby zastrešovala „Uhorská esperantská spoločnosť” a „Verda Standardo”. V Prahe boli činné spolky "Bohema Unio Esperantista", ktorý prijímal len organizácie a kluby, a "Bohema Asocio Esperantista", ktorý prijímal jednotlivcov. Oba spolky vydávali svoje časopisy. V roku 1907, 20 rokov po zverejnení jazyka Zamenhofom, vydal tolstojovec Albert Škarvan spolu s Rusom N. P. Evstifejevom prvú učebnicu esperanta v slovenčine, „Základy medzinárodnej reči ESPERANTO“. - -Po prvej svetovej vojne sa oba pražské spolky zlúčili do "Československej Esperantskej Asociácie". Tá bola v roku 1936 premenovaná na "Esperantskú Asociáciu v Československej republike". V tomto období bolo hnutie veľmi aktívne, fungovalo mnoho klubov, konalo sa veľa prednášok a kurzov. Esperanto bolo vyučované na školách rôznych stupňov, rádio Bratislava od 1930 vysielalo kurzy a od 1932 aj kultúrny program v esperante. Bola vydaná "Československá antológia" predstavujúca diela 20 slovenských autorov. V rámci protifašistickej aktivity vychádzali aj preklady protifašistických článkov z esperantských časopisov z obdobia Španielskej občianskej vojny. - -Druhá svetová vojna utlmila esperantské hnutie. Bratislavský esperantský klub požiadal o zmenu štatútu a rozšírenie poľa pôsobnosti na celú vtedajšiu Slovenskú republiku a následne sa stal strediskom esperantského hnutia na Slovensku.'''; diff --git a/benchmarks/Utf8Decode/dart2/zhtext_10k.dart b/benchmarks/Utf8Decode/dart2/zhtext_10k.dart deleted file mode 100644 index 20e50d9c912..00000000000 --- a/benchmarks/Utf8Decode/dart2/zhtext_10k.dart +++ /dev/null @@ -1,75 +0,0 @@ -// This text is an extract from the Chinese Wikipedia article about Kanji -// (汉字): https://zh.wikipedia.org/wiki/汉字 -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String zh = ''' -最簡單的漢字只有一笔画,但卻不止一個字:除了「一」字以外,「乙」、「〇」、「丶」、「丨」、「亅」、「丿」、「乀」、「乁」、「𠄌」、「𠃋」、「𠃉」、「𠃊」、「乚」等都是漢字,而且都有各自的讀音。 - -中文汉字中,笔画最多的汉字可能是“”,是一种面食的名称,此字至今习用,其不同写法的笔画数在54至71画之间不等。被传统辞典收录的笔画最多的汉字为《字汇补》、《汉语大字典》中由四个“-{龍}-”字组成的「」字,共64画;同樣屬於64劃的字由四個“-{興}-”字組成的“𠔻”字,收入自《中文大辭典》;之後的是由四個「雷」字組成的“䨻”字,有52劃,收錄於《說文解字》。 - -另外,日本汉字「」收录于日本的TRON计划中,但此字无法提供有效证据表明其确有使用,因此状况存疑。该字由3個「-{龍}-」字和3個「-{雲}-」個組合而成,共有84劃。该字曾提交到当时的统一码扩展C区,编号为JMK66147,后因扩展C区的时间原因被安排到了扩展D区,之后因找不到合适证据被撤销。最后提交到扩展G区并被接受。 - -現在,純漢字僅僅被用於記錄漢語。而漢字和假名一起被用於記錄日語。 - -其他一些民族在早期會將漢字單純作為表音文字來記錄他們的語言。如蒙古語最早的文獻蒙古秘史即用純漢字當做表音文字進行記錄。日語最早的文獻也是把漢字當做表音文字來記錄日語,後來演變出萬葉假名。 - -契丹文、女真文、西夏文的創製受到了漢字的影響,它們跟漢字一樣都是方塊型文字,筆畫形狀也極其類似,也採用類似六書的造字法。但這些文字除個別字與漢字外形相同外,絕大部分字形都跟漢字不同,因此在Unicode中它們都是獨立區塊編碼的。 - -古壯字(方塊壯字)、古白字(方塊白字)、古布依字(方塊布依字)、字喃等文字可以說是漢字在其他語言中的擴充,因為它們很大一部分本身就是漢字(賦予新義),另一些則是用已有漢字偏旁組合構成新字,因此,這些文字的外觀上與漢字很相似,在Unicode中與漢字一道編入漢字區。 - -女書是用於記錄漢語的另一種文字,它們的造字法與六書有部分相似之處,但字的外觀與漢字差異較大,Unicode中作為獨立區塊編碼。 - -以上文字都因各種原因而消亡,如今除專家學者外無幾人能識。 - -日語的假名()是由漢字的草體、簡筆演變而成的。諺文和日語假名一樣可以和漢字一同混寫。 - -此外如蒙古文、滿文、錫伯文等也是在漢字書寫方式和書寫工具的影響下,將從右向左書寫的源自察合台文的書寫方式改為從上到下書寫,文字的結構也隨之有所變化。 - -漢字是承載文化的重要工具,目前留有大量用漢字書寫的典籍。不同的方言、甚至語言都使用漢字作為共同書寫體系。在古代日本、朝鮮半島、越南、琉球群島,以及位於婆羅洲的蘭芳共和國,漢字都曾是該國正式文書的唯一系統,因而漢字在歷史上對文明的傳播分享有著重要作用。 - -由於漢字和發聲的聯繫不是非常密切,比較容易被其他民族所借用,如日本、朝鮮半島和越南都曾經有過不會說漢語,單純用漢字書寫的歷史階段。漢字的這個特點對於維繫一個文化圈—一個充滿各種互相不能交流的方言群體的民族——發揮了主要的作用。 - -漢字對周邊國家的文化產生過巨大的影響,形成了一個共同使用漢字的漢字文化圈,在日本、越南和朝鮮半島、琉球群島,漢字被融合成它們語言的文字「」、「」、「」。直到現在,日語中仍然把漢字認為是書寫體系的一部分。在北韓和越南,已經完全不再使用漢字;在韓國,漢字的使用在近幾十年來越來越少;但是由於朝鮮語/韓語中使用了大量的漢字詞彙,並且重音現象嚴重,所以在需要嚴謹表達的場合時仍然會使用漢字。雖然在通常情況下人名、公司機構名稱等均使用韓文書寫,不過大多數的人名、公司機構均有其對應的漢字名稱。 - -漢字於公元3世紀經朝鮮半島輾轉傳入日本。二戰後日本開始限制漢字的數量和使用,頒布了《當用漢字表》及《人名用字表》等,其中簡化了部分漢字(日本新字體),不過文學創作使用的漢字,並不在限制之列。日本除從中文中傳入的漢字外,還創造和簡化了一些漢字,如「-{辻}-」(十字路口)、「-{栃}-」、「-{峠}-」(山道)和「-{広}-」(廣)、「-{転}-」(轉)、「-{働}-」(勞動)等。 - -公元3世紀左右,漢字傳入了朝鮮半島,朝鮮語/韓語曾經完全使用漢字來書寫。相傳薛聰在當時發明了吏讀,把朝鮮語用同音或同義的漢字來表示。例如:「乙」字被用來表示韓語中的後綴「-l()」。由於有不少發音都沒有對應的漢字,所以朝鮮半島的人民又運用組字法,把兩個或多個漢字合組成為一個新的吏讀字。相傳後來的契丹文就是受到吏讀字的影響。此外尚有鄉札、口訣等以漢字表記朝鮮語的方法。 - -1443年,朝鮮世宗大王頒布《訓民正音》,發明了諺文與漢字一起使用,但當中有不少部件仍然有昔日吏讀字的痕跡。現在的大韓民國雖禁止在正式場合下使用漢字,並停止了在中小學中教授漢字(但是從2011年開始,大韓民國的李明博政府已經決定將漢字重新納入中小學的課程裡),不過漢字在民間仍在繼續使用,且可以按照個人習慣書寫,但是現在能寫一筆漂亮漢字的韓國人越來越少。朝鮮民主主義人民共和國於1948年廢除了漢字,僅保留了十幾個漢字(參見廢除漢字)。 - -公元1世紀漢字便傳入了越南,越南語也曾完全使用漢字做為書寫用文字,並在漢字的基礎上創造了喃字,但是由於書寫不便,漢字仍是主要的書寫方式。 - -1945年越南民主共和國成立後廢除漢字,使用了稱為「國語字」的拼音文字。現在的越南文已經看不出漢字的痕跡了。 - -中國許多民俗都與漢字有關,例如: - -漢字獨特優美的結構,書寫的主要工具——毛筆有多樣的表現力,因而產生了中文獨特的造型藝術——書法。而篆刻是和書法相關的藝術,用刀在石材上雕刻出篆字作為印章,尚有勒石、山壁題字等。 -同一个汉字,可以有不同的字体。當前漢字字體主要有篆書、隷書、草書、行書、楷書等。 - -漢字歷史上是不斷在組新字的,目前的各種漢字並非同时定型于某一年代,而是應時代需要逐渐發展而来的。例如:“人”字在商朝就已出现,“凹”字和“凸”字則是在唐朝才出現的。 - -此外不同的行業也会因用字需求而造字。例如:中国的傳統音乐在記譜上會使用減字譜、工尺譜。 - -自十九世紀中葉後,亞洲和西方都發佈了很多漢字拉丁化方案,如: - -現在,漢語拼音方案是使用最廣且被聯合國接受的汉字拉丁化方案。而威妥瑪拼音歷史悠久,至今仍用於臺灣的人名、地名拼寫。 -汉字中存在许多异体字,它们的意义和读音完全相同,只是写法不同。异体字的产生部分是由于历史原因,有的则是人为造字,如「和、咊、-{龢}-」、「秋、-{秌}-、龝」等。 - -臺灣也有使用所謂的異體字,例如“-{臺}-”與“-{台}-”、“-{體}-”與“-{体}-”以及“-{學}-”與“-{学}-”等等。 - -中国大陆於1956年公布整理异体字表,废除了大量异体字,但後來因為各種原因恢復了部分異體字。如“-{於}-”曾被當作“-{于}-”的異體字廢除掉,但在1988年發表的《現代漢語通用字表》中又恢復成為規範字,因爲姓氏中「-{于}-」和「-{於}-」同時存在,不宜合併。另外,不同地區對異體字的取捨有所不同,例如:韓國就以漢字各種異體字中最早出現的樣式為標準寫法。所以,在韓語漢字的標準中,取“甛”而不取“甜”、取“-{幇}-”而不取“-{幫}-”、取“-{畵}-”而不取“-{畫}-”。 - -由于英文文字是由26个字母排列组合而成的文字,因此可以简化输入步骤;相比较之下汉字则不能如此,从字形上汉字虽然可以拆解成不同的部分,但是被分成的部首或偏旁数量过多,这样不但不能达到简化输入的目的,反而显得更为繁琐。于是从汉字字音上去考虑,汉字输入被分成少量的语音元素组合排列,反而可以达到简化输入的步骤。因为是语音输入对汉字的读音必须清楚,某些生僻字或不知道汉字发音的则会很困难,这在一定程度上限制了汉字的输入。 - -由于打字機鍵盤是為歐美文字設計的,在設計時本身沒有考慮汉字輸入的問題,輸入漢字往往比輸入拼音文字困難。汉字没有经过中文打字機的普及,直接进入了電腦中文信息处理阶段。在電腦發明初期曾引起漢字能否適應電腦時代的問題,支持漢字拉丁化的學者甚至以此為理據。 - -随着各种中文输入法的出现,汉字的计算机输入、存储、输出技术得到了基本解决,大大提高了中文写作、出版、信息检索等的效率。目前中文输入法有上千种之多,主要包括表音输入和表形输入两类,也有两者兼之的。汉字的语音输入、手写识别和光学字符识别(OCR)技术也已得到广泛应用。 - -如收录数千字的GB 2312(中國大陸)、B'''; diff --git a/benchmarks/Utf8Encode/dart2/Utf8Encode.dart b/benchmarks/Utf8Encode/dart2/Utf8Encode.dart deleted file mode 100644 index c074671520e..00000000000 --- a/benchmarks/Utf8Encode/dart2/Utf8Encode.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. -// -// Benchmark for UTF-8 encoding - -// @dart=2.9 - -import 'dart:convert'; - -import 'package:benchmark_harness/benchmark_harness.dart'; - -import 'datext_latin1_10k.dart'; -import 'entext_ascii_10k.dart'; -import 'netext_3_10k.dart'; -import 'rutext_2_10k.dart'; -import 'sktext_10k.dart'; -import 'zhtext_10k.dart'; - -class Utf8Encode extends BenchmarkBase { - final String language; - final String originalText; - // Size is measured in number of runes rather than number of bytes. - // This differs from the Utf8Decode benchmark, but runes are the input - // to the encode function which makes them more natural than bytes here. - final int size; - List benchmarkTextChunks; - - static String _makeName(String language, int size) { - String name = 'Utf8Encode.$language.'; - name += - size >= 1000000 - ? '${size ~/ 1000000}M' - : size >= 1000 - ? '${size ~/ 1000}k' - : '$size'; - return name; - } - - Utf8Encode(this.language, this.originalText, this.size) - : super(_makeName(language, size)); - - @override - void setup() { - final int nRunes = originalText.runes.toList().length; - final String repeatedText = originalText * (size / nRunes).ceil(); - final List runes = repeatedText.runes.toList(); - final int nChunks = (size < nRunes) ? (nRunes / size).floor() : 1; - benchmarkTextChunks = List.filled(nChunks, null); - for (int i = 0; i < nChunks; i++) { - final offset = i * size; - benchmarkTextChunks[i] = String.fromCharCodes( - runes.sublist(offset, offset + size), - ); - } - } - - @override - void run() { - for (int i = 0; i < benchmarkTextChunks.length; i++) { - final encoded = utf8.encode(benchmarkTextChunks[i]); - if (encoded.length < benchmarkTextChunks[i].length) { - throw 'There should be at least as many encoded bytes as runes'; - } - } - } - - @override - void exercise() { - // Only a single run per measurement. - run(); - } - - @override - double measure() { - // Report time per input rune. - return super.measure() / size / benchmarkTextChunks.length; - } - - @override - void report() { - // Report time in nanoseconds. - final double score = measure() * 1000.0; - print('$name(RunTime): $score ns.'); - } -} - -void main(List args) { - const texts = {'en': en, 'da': da, 'sk': sk, 'ru': ru, 'ne': ne, 'zh': zh}; - final benchmarks = [ - for (int size in [10, 10000, 10000000]) - for (String language in texts.keys) - () => Utf8Encode(language, texts[language], size), - ]; - - for (var bm in benchmarks) { - bm().report(); - } -} diff --git a/benchmarks/Utf8Encode/dart2/datext_latin1_10k.dart b/benchmarks/Utf8Encode/dart2/datext_latin1_10k.dart deleted file mode 100644 index 4e13b7e7f01..00000000000 --- a/benchmarks/Utf8Encode/dart2/datext_latin1_10k.dart +++ /dev/null @@ -1,64 +0,0 @@ -// This text is an extract from the Danish Wikipedia article about Donald Duck -// (Anders And): https://da.wikipedia.org/wiki/Anders_And -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String da = ''' -Anders And - -Anders Fauntleroy And er en berømt figur i Disneys tegnefilm og tegneserier. Selv om han ikke er særligt populær i USA, optræder han i mange ugeblade i Europa: I Norge, Tyskland, Sverige, Danmark, Holland, Italien med flere. Hans første optræden var i tegnefilmen "The Wise Little Hen" (Den kloge lille høne) fra 9. juni 1934. Hans karakteristiske stemme blev indtalt af radiokomikeren Clarence Nash, der siden fast lagde stemme til. -Efter Nash' død i 1985 overtog tegnefilmsdubberen Tony Anselmo. Det var i øvrigt Nash selv, der trænede Anselmo til at lyde som Anders And. I Danmark har tre lagt stemme til Anders And: Bjarne H. Hansen, Dick Kaysø og Peter Zhelder. Dick Kaysø og Peter Zhelder lægger stadigvæk stemme til ham. - -Anders And var en bifigur til filmen Den lille kloge Høne, han havde et langt spidst næb og en utrolig kort lunte; der skulle ikke meget til for at udløse et raserianfald hos ham. Klassikerne er fra 1930'erne, hvor Mickey, Fedtmule og Anders er et trekløver, der er film som "Mickeys Campingvogn," "Tårnuret" og "Ensomme Spøgelser." Fred Spencer og Dick Lundy var animatorer. Efterhånden opnåede anden større popularitet, hvad der ikke rigtig huede Disney, der ikke brød sig om den krakilske and. Men Anders blev forfremmet til hovedfigur i en serie film, der begyndte med "Anders And og Strudsen" i 1938. Med den var det "ande-teamet" hos Disney født: instruktøren Jack King og assistenterne Carl Barks (den senere serieskaber), Chuck Couch, Harry Reeves og Jack Hannah. Han var stadigvæk en hidsigprop, men han blev gjort mere nuanceret, og nye figurer blev tilføjet som nevøerne Rip, Rap og Rup, kæresten Andersine And og i en enkelt film Fætter Guf. - -Under 2. verdenskrig blev der lavet film om anden i militærtjeneste, som han selvfølgelig gør meget klodset. Mest kendt er "Der Fuehrers Face" fra 1943, hvor anden drømmer, at han er i diktaturstaten Nutziland. Den film blev arkiveret af Disney efter krigen, men er senere vist meget uofficielt. Desuden medvirkede han i to mindre kendte spillefilm "Saludos Amigos" 1943 og "The Three Caballeros" 1945, der gav et lystigt billede af livet i Latinamerika. - -Efter krigen blev omgivelserne mere hjemlige, men næppe mere fredfyldte. I 1947 overtog Jack Hannah pladsen som instruktør. Filmene handlede ofte om klammeri med andre, det kunne være en bi, Chip og Chap eller bare ting han ikke kunne få til at makke ret. Anders var her ofte plageånden, hvis egne drillerier kom tilbage som en boomerang. - -Fjernsynets fremmarch i 1950'erne satte snart stopper for de korte tegnefilm, og Jack Hannah blev sat til at redigere Disneys tv-shows og kæde de korte tegnefilm sammen i et længere forløb. Her blev Anders gjort mere sympatisk, men det var eksperten i alt, Raptus von And, der gjorde mest for tv-showet. I et andet tv-show Disney Sjov medvirkede Anders i tv-serierne Rip, Rap og Rup på eventyr, Bonkers, og Rap Sjak. I Rip, Rap og Rup på eventyr, var han sjældent med, men fik et nyt tøj. I Rap Sjak var hans matrostøj skiftet ud med en hawaii-skjorte med røde og hvide blomster. I Bonkers var han også med kort tid. - -Anders And gik til tegneserien allerede tidligt efter sin debut i 1934, hvor han i avisstriber optrådte med sin makker fra "The Wise Little Hen," Peter Gris. Fra den 10. februar 1935 blev han en del af Mickeys avisstribe som musens kujonagtige og drillesyge ven, men fra 1936 kaprede han hovedrollen i Silly Symphony-striben. Forfatteren Ted Osborne og tegneren Al Taliaferro, der stod bag serieudgaven af The Wise Little Hen, pressede på, og da det blev en succes kunne forfatteren Bob Karp i samarbejde med Taliaferro lave andens egen avisstribe. - -Det blev en populær serie. I de allertidligste serier var Anders en hidsig, ondskabsfuld og pueril and med langt spidst næb og hænder, der knap kunne skelnes fra vinger. Senere blev han mere voksen, da han fik ansvaret for sine tre nevøer Rip, Rap og Rup, og kæresten Andersine kom til sammen med Bedstemor And. - -Tegneseriefiguren Anders And blev senere udviklet yderligere af Carl Barks. I de tidlige tegnefilm var han for det meste doven og hidsig; men for at gøre hans figur brugbar til en tegneserie besluttede Barks at udvide hans personlighed. Anders' mest gennemgående karaktertræk er hans notoriske uheld, som desuden har den narrative funktion at give adgang til spændende eventyr, uden at serien udvikler sig for meget. På denne måde kan Anders eksempelvis blive involveret i alverdens skattejagter, og da han altid ender med at miste den fundne gevinst, kan alle historierne starte fra samme udgangspunkt. - -For at give Anders en verden at bo i, skabte Barks byen Andeby i den amerikanske stat Calisota (som er en blanding af de to amerikanske stater Californien og Minnesota) med indbyggere som den rige onkel Joakim von And, den heldige Fætter Højben og den dygtige opfinder Georg Gearløs. - -Anders lægger med sit engelske navn Donald Duck i øvrigt navn til donaldismen, fankulturen omkring Disney-tegneserier og -tegnefilm, som den norske forfatter Jon Gisle udviklede med sin bog af samme navn. - -Anders bor i Andeby på Paradisæblevej 111 med sine tre nevøer Rip, Rap og Rup. De er stort set identiske, men de kan i nogle historier identificeres på, hvilken farve kasket de har på. - -Ifølge Disneytegneserieforfatteren Don Rosa var Anders født et eller andet sted omkring 1920 men dette er "ikke" officielt. Ifølge Carl Barks' stamtræ (senere udviklet og genbygget af Don Rosa for den danske udgiver Egmont Serieforlaget) er Anders' forældre Hortensia von And og Rapmus And. Anders har en søster ved navn Della And, men hverken hun eller Anders' forældre optræder i tegnefilmene eller tegneserierne bortset fra særlige steder som eksempelvis i Her er dit liv, Joakim. Ifølge Don Rosa er Anders og Della tvillinger. - -Fra tegnefilmen "Mr. Duck Steps Out" har Anders' kæreste været Andersine And, men han går i stadig fare for at miste hende til den heldige Fætter Højben. I nogle italienske historier er Anders også superhelt under dæknavnet "Stålanden". - -Anders' onkel, Joakim von And, er den rigeste and i verden. - -Sammen med onkelen og nevøerne Rip, Rap og Rup har Anders And rejst jorden rundt til mange forskellige lande og steder. Blandt disse er landet Langtbortistan, hvis navn blev opfundet af den danske oversætter Sonja Rindom og senere er gledet ind i almindeligt, dansk sprogbrug. - -I de tidlige historier af Carl Barks havde Anders en hale, der stak langt bagud. Han havde langt næb og lang hals, og hans matrostrøje havde fire knapper. Hans lange hals passede godt til egenskaben nysgerrighed og det lange næb til hans hidsighed, hvilket var to egenskaber, der prægede ham mest. Disse tidlige historier var også præget af en grov komik i stil med tegnefilmene. - -Siden fik han et mere strømlinet udseende og kortere næb (dog ikke så kort som visse tegnere i 1960'erne gjorde det!) og kun to knapper på trøjen, et udseende de øvrige andetegnere også tager til sig. Her blev hans natur også mere sammensat, og han ligner mest af alt en tragisk helt. Komikken kommer mere og mere til at ligge i replikkerne. - -Anders And optræder særligt i jumbobøgerne med en hemmelig identitet i form af superhelten Stålanden. Figuren er inspireret af Batman og er skabt af den italienske forfatter Guido Martina i samarbejde med kunstneren Giovan Battista Carpi i 1969 i hans italienske navn Paperinik. Ofte tegnet af Romano Scarpa. - -I lighed med inspirationskilden er han maskeret og har et hav af tekniske opfindelser, som han bruger i kamp mod forbryderne og overvejende! i kamp for at redde sit andet jeg, Anders And, ud af kniben. Den eneste, som kender hans hemmelige identitet, er opfinderen Georg Gearløs, som har udstyret gamle 313 med moderne udstyr og finurligheder. Det er ikke så tit at Stålanden optræder; næsten kun i Jumbobøger, men har dog også optrådt i Anders And-bladene med en gæstehistorie, hvor Stålanden kæmper mod en tidligere fjende, som nu havde kaldt sig Lord Hvalros. - -Efter at Stålanden i starten af 1990'erne ikke var benyttet så meget af historieskriverne, forsvandt han næsten ud af Disney-universet indtil 1996, hvor en ny serie, "Stålanden på nye eventyr", startede med Stålanden i hovedrollen (umiddelbart inspireret af Marvel universet). Denne relancering af Stålanden gav karakteren det ekstra, der skulle til for at få et godt comeback. - -I modsætning til størstedelen af Anders And-tegneserier har denne serie en sammenhængende forløb. I serien optræder kun sjældent de andre figurer fra de normale Anders And tegneserier; oftest er det kun en kort birolle eller en reference, men til gengæld er en mængde nye figurer kommet til. - -Serien starter med, at Anders And er ansat som vicevært i Ducklair Tower, et højhus bygget af mangemilliardæren Everett Ducklair, en fremragende videnskabsmand og opfinder, som forlod Andeby og drog til et tibetansk kloster, Dhasam-Bul. Anders finder Globus, en kunstig intelligens skabt af Ducklair, samt Ducklair's arsenal af våben og opfindelser. Dette bliver starten på Anders' liv som Stålanden. -En mængde temaer var ofte i centrum for historierne, bl.a. tidsrejser og Tidspolitiets kamp med tidspiraterne fra Organisationen, invasion fra rummet af de magtsyge evronianere, Stålandens samarbejde med FBI og meget mere. - -Serien fik en fornyelse i 2001, hvilket ændrede markant på historierne. Everett Ducklair vender tilbage, slukker Globus, smider Stålanden ud af Ducklair Tower og genopretter sit gamle imperium. Undervejs bliver Ducklair's to døtre afsløret. De hader begge Everett af grunde, der ikke bliver afsløret til fulde, selvom det bliver antydet, at Everett skilte sig af med deres mor på en eller anden måde. -Denne fornyelse holdt 18 numre, før serien blev afsluttet, dog uden at historierne fik en slutning. - -Barks-historien "Anders And og den gyldne hjelm" fra 1954 kom i 2006 med i '''; diff --git a/benchmarks/Utf8Encode/dart2/entext_ascii_10k.dart b/benchmarks/Utf8Encode/dart2/entext_ascii_10k.dart deleted file mode 100644 index d7da461074d..00000000000 --- a/benchmarks/Utf8Encode/dart2/entext_ascii_10k.dart +++ /dev/null @@ -1,37 +0,0 @@ -// This text is an extract from the English Wikipedia article about Anarchism: -// https://en.wikipedia.org/wiki/Anarchism -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String en = ''' -Anarchism - -Anarchism is a radical political movement that is highly skeptical towards authority and rejects all forms of unjust hierarchy. It calls for the abolition of the state which it holds to be undesirable, unnecessary, and harmful. Anarchism advocates for the replacement of the state with stateless societies or other forms of free associations. - -Anarchism's timeline stretches back to prehistory when people lived in anarchistic societies long before the establishment of formal states, kingdoms or empires. With the rise of organised hierarchical bodies, skepticism towards authority also rose, but it was not until the 19th century a self-conscious political movement was formed. During the latest half of 19th and the first decades of 20th century, the anarchist movement flourished to most parts of the world, and had a significant role in worker's struggles for emancipation. Various branches of anarchism were espoused during those times. Anarchists took part in several revolutions, most notably in the Spanish Civil War, where they were crushed by the fascists forces in 1939, marking the end of the classical era of anarchism. In the latest decades of the 20th century, the anarchist movement nonetheless became relevant and vivid once more. - -Anarchism employ various tactics in order to meet their ideal ends; these can be broadly separated in revolutionary and evolutionary tactics. There is significant overlap between the two legs which are merely descriptive. Revolutionary tactics aim to bring down authority and state, and have taken a violent turn in the past. Evolutionary tactics aim to prefigure what an anarchist society would be like. Anarchism's thought, criticism and praxis has played a part in diverse fields of human society. - -The etymological origin of the word "anarchism" is from the ancient Greek word "anarkhia", meaning "without a ruler", composed of the prefix "an-" (i.e. "without") and the word "arkhos" (i.e. "leader" or "ruler"). The suffix -ism denotes the ideological current that favours anarchy. The word "anarchism" appears in English from 1642 as "anarchisme" and the word "anarchy" from 1539. Various factions within the French Revolution labelled their opponents as "anarchists", although few such accused shared many views with later anarchists. Many revolutionaries of the 19th century such as William Godwin (17561836) and Wilhelm Weitling (18081871) would contribute to the anarchist doctrines of the next generation, but they did not use the word "anarchist" or "anarchism" in describing themselves or their beliefs. - -The first political philosopher to call himself an "anarchist" () was Pierre-Joseph Proudhon (18091865), marking the formal birth of anarchism in the mid-19th century. Since the 1890s and beginning in France, the term "libertarianism" has often been used as a synonym for anarchism and its use as a synonym is still common outside the United States. On the other hand, some use "libertarianism" to refer to individualistic free-market philosophy only, referring to free-market anarchism as libertarian anarchism. - -While opposition to the state is central to anarchist thought, defining anarchism is not an easy task as there is a lot of talk among scholars and anarchists on the matter and various currents perceive anarchism slightly differently. Hence, it might be true to say that anarchism is a cluster of political philosophies opposing authority and hierarchical organization (including the state, capitalism, nationalism and all associated institutions) in the conduct of all human relations in favour of a society based on voluntary association, on freedom and on decentralisation, but this definition has the same shortcomings as the definition based on etymology (which is simply a negation of a ruler), or based on anti-statism (anarchism is much more than that) or even the anti-authoritarian (which is an "a posteriori" conclusion). Nonetheless, major elements of the definition of anarchism include the following: - -During the prehistoric era of mankind, an established authority did not exist. It was after the creation of towns and cities that institutions of authority were established and anarchistic ideas espoused as a reaction. Most notable precursors to anarchism in the ancient world were in China and Greece. In China, philosophical anarchism (i.e the discussion on the legitimacy of the state) was delineated by Taoist philosophers Zhuangzi and Lao Tzu. Likewise, anarchic attitudes were articulated by tragedians and philosophers in Greece. Aeschylus and Sophocles used the myth of Antigone to illustrate the conflict between rules set by the state and personal autonomy. Socrates questioned Athenian authorities constantly and insisted to the right of individual freedom of consciousness. Cynics dismissed human law ("nomos") and associated authorities while trying to live according to nature ("physis"). Stoics were supportive of a society based on unofficial and friendly relations among its citizens without the presence of a state. - -During the Middle Ages, there was no anarchistic activity except some ascetic religious movements in the Islamic world or in Christian Europe. This kind of tradition later gave birth to religious anarchism. In Persia, Mazdak called for an egalitarian society and the abolition of monarchy, only to be soon executed by the king. In Basra, religious sects preached against the state. In Europe, various sects developed anti-state and libertarian tendencies. Libertarian ideas further emerged during the Renaissance with the spread of reasoning and humanism through Europe. Novelists fictionalised ideal societies that were based not on coercion but voluntarism. The Enlightenment further pushed towards anarchism with the optimism for social progress. - -During the French Revolution, the partisan groups of Enrags and saw a turning point in the fermentation of anti-state and federalist sentiments. The first anarchist currents developed throughout the 18th centuryWilliam Godwin espoused philosophical anarchism in England, morally delegitimizing the state, Max Stirner's thinking paved the way to individualism, and Pierre-Joseph Proudhon's theory of mutualism found fertile soil in France. This era of classical anarchism lasted until the end of the Spanish Civil War of 1936 and is considered the golden age of anarchism. -Drawing from mutualism, Mikhail Bakunin founded collectivist anarchism and entered the International Workingmen's Association, a class worker union later known as the First International that formed in 1864 to unite diverse revolutionary currents. The International became a significant political force, and Karl Marx a leading figure and a member of its General Council. Bakunin's faction, the Jura Federation and Proudhon's followers, the mutualists, opposed Marxist state socialism, advocating political abstentionism and small property holdings. After bitter disputes the Bakuninists were expelled from the International by the Marxists at the 1872 Hague Congress. Bakunin famously predicted that if revolutionaries gained power by Marxist's terms, they would end up the new tyrants of workers. After being expelled, anarchists formed the St. Imier International. Under the influence of Peter Kropotkin, a Russian philosopher and scientist, anarcho-communism overlapped with collectivism. Anarcho-communists, who drew inspiration from the 1871 Paris Commune, advocated for free federation and distribution of goods according to one's needs. - -At the turning of the century, anarchism had spread all over the world. In China, small groups of students imported the humanistic pro-science version of anarcho-communism. Tokyo was a hotspot for rebellious youth from countries of the far east, pouring into the Japanese capital to study. In Latin America, So Paulo was a stronghold for anarcho-syndicalism where it became the most prominent left-wing ideology. During this time, a minority of anarchists adopted tactics of revolutionary political violence. This strategy became known as propaganda of the deed. The dismemberment of the French socialist movement into many groups and the execution and exile of many Communards to penal colonies following the suppression of the Paris Commune favoured individualist political expression and acts. Even though many anarchists distanced themselves from these terrorist acts, infamy came upon the movement. Illegalism was another strategy which some anarchists adopted these same years. -Anarchists enthusiastically participated in the Russian Revolutiondespite concernsin opposition to the Whites. However, they met harsh suppression after the Bolshevik government was stabilized. Several anarchists from Petrograd and Moscow fled to Ukraine, notably leading to the Kronstadt rebellion and Nestor Makhno's struggle in the Free Territory. With the anarchists being crushed in Russia, two new antithetical currents emerged, namely platformism and synthesis anarchism. The former sought to create a coherent group that would push for the revolution while the latter were against anything that would resemble a political party. Seeing the victories of the Bolsheviks in the October Revolution and the resulting Russian Civil War, many workers and activists turned to communist parties which grew at the expense of anarchism and other socialist movements. In France and the United States, members of major syndicalist movements, the General Confederation of Labour and Industrial Workers of the World, left their organisations and joined the Communist International. - -In the Spanish Civil War, anarchists and syndicalists (CNT and FAI) once again allied themselves with various currents of leftists. A long tradition of Spanish anarchism led to anarchists playing a pivotal role in the war. In response to the army rebellion, an anarchist-inspired movement of peasants and workers, supported by armed militias, took control of Barcelona and of large areas of rural Spain where they collectivised '''; diff --git a/benchmarks/Utf8Encode/dart2/netext_3_10k.dart b/benchmarks/Utf8Encode/dart2/netext_3_10k.dart deleted file mode 100644 index 1538945d06f..00000000000 --- a/benchmarks/Utf8Encode/dart2/netext_3_10k.dart +++ /dev/null @@ -1,26 +0,0 @@ -// This text is an extract from the Nepali Wikipedia article about Nepal -// (नेपाल): https://ne.wikipedia.org/wiki/नेपाल -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String ne = ''' -नेपाल - -नेपाल (आधिकारिक नाम: सङ्घीय लोकतान्त्रिक गणतन्त्र नेपाल) दक्षिण एसियाली भूपरिवेष्ठित हिमाली राष्ट्र हो । यसको भौगोलिक अक्षांश २६ डिग्री २२ मिनेटदेखि ३० डिग्री २७ मिनेट उत्तर र ८० डिग्री ४ मिनेटदेखि ८८ डिग्री १२ मिनेट पूर्वी देशान्तरसम्म फैलिएको छ । यसको कूल क्षेत्रफल १,४७,१८१ वर्ग कि.मि छ । यो क्षेत्रफल पृथ्वीको कूल क्षेत्रफलको ०.०३% र एसिया महादेशको ०.३% पर्दछ । लण्डन स्थित "ग्रीनवीच मिनटाइम" भन्दा पूर्वतर्फ रहेकोले गौरीशङ्कर हिमालको नजिक भएर जाने ८६ डिग्री १५ मिनेट पूर्वी देशान्तरलाई आधार मानी नेपालको प्रमाणिक समय ५ घण्टा ४५ मिनेट आगाडि मानिएको छ । - -नेपालको पूर्वी सीमाना मेची नदीदेखि पश्चिमी सीमाना महाकाली नदीसम्मको औसत लम्वाई ८८५ कि.मि. छ । उत्तरदेखि दक्षिणको चौडाई भने एकनासको छैन । पूर्वी भागभन्दा पश्चिमी भाग केही चौडा छ । त्यस्तै मध्य भाग भने केही खुम्चिएको छ । यसमा अधिकतम चौडाई २४१ कि.मि. र न्यूनतम चौडाई १४५ कि.मि. रहेको छ । यसर्थ नेपालको औसत चौडाई १९३ कि.मि. रहेको छ । नेपालको उत्तरमा चीनको स्वशासित क्षेत्र तिब्बत पर्दछ भने दक्षिण, पूर्व र पश्चिममा भारत पर्दछ । नेपालका ८०% भन्दा बढी नागरिक हिन्दू धर्म मान्दछन् जुन विश्वकै सबैभन्दा बढी प्रतिशत हिन्दू धर्मावलम्बी हुने राष्ट्र पनि हो । यसबाहेक बौद्ध, इस्लाम, किराॅत आदि धर्म मान्ने मानिसहरू पनि यहाँ बसोबास गर्दछन् । एउटा सानो क्षेत्रको लागि नेपालको भौगोलिक विविधता निकै उल्लेखनीय छ । यहाँ तराईका उष्ण फाँटदेखि चिसा हिमालयका शृंखला अवस्थित छन् । संसारका सबैभन्दा उच्च १४ हिमश्रृंखलाहरु मध्ये ८ वटा नेपालमा पर्दछन्, जसमध्ये संसारको सर्वोच्च शिखर सगरमाथा (नेपाल र चीनको सीमानामा पर्ने) पनि एक हो । नेपालको प्रमुख सहर एवं राजधानी काठमाडौं हो । काठमाडौं, ललितपुर र भक्तपुर सहरहरूलाई काठमाडौं उपत्यका भनेर चिनिन्छ । अन्य प्रमुख सहरहरूमा भरतपुर, बिराटनगर, भैरहवा, वीरगञ्ज, जनकपुर, पोखरा, नेपालगञ्ज, धनगढी र महेन्द्रनगर पर्दछन् । - -नेपाल शब्दको उत्त्पत्ति बारेमा ठोस प्रमाण त उपलब्ध छैन, तर एक प्रसिद्ध विश्वास अनुसार मरिची ॠषि पुत्र 'ने' मुनिले पालन गरेको ठाउँको रूपमा यहाँको नाम नेपाल रहन गएको हो । निरन्तर रूपमा राजा-रजौटाहरूको अधीनमा रहेर फुट्ने र जुट्ने लामो तथा सम्पन्न इतिहास बोकेको, अहिले नेपाल भनेर चिनिने यो खण्डले वि. सं. २०४६ सालको आन्दोलन पश्चात् संवैधानिक राजतन्त्रको नीति अवलम्बन गर्‍यो । तर यस पश्चात् पनि राजसंस्था एक महत्त्वपूर्ण तथा अस्पष्ट परिधि तथा शक्ति भएको संस्थाको रूपमा रहिरह्यो । यो व्यवस्थामा पहिले संसदीय अनिश्चितता तथा सन् १९९६ देखि ने.क.पा.(माओवादी)को जनयुद्धको कारणले राष्ट्रिय अनिश्चितता देखियो । - -माओवादीहरूले राजनीतिको मूलाधारबाट अल्लगिएर भूमिगत रूपमा राजतन्त्र तथा मूलाधारका राजनीतिक दलहरूको विरुद्धमा गुरिल्ला युद्ध सञ्चालन गरे, जसको कारण १३,००० भन्दा बढी मानिसहरूको ज्यान जान पुग्यो । यही विद्रोहलाई दमन गर्ने पृष्ठभूमिमा राजाले सन् २००२ मा संसदको विघटन गरी निर्वाचित प्रधानमन्त्रीलाई अपदस्त गरेर प्रधानमन्त्री मनोनित गर्दै शासन चलाउन थाले । सन् २००५ मा उनले एकनासै संकटकालको घोषणा गरेर सबै कार्यकारी शक्ति ग्रहण गरे। सन् २००६को लोकतान्त्रिक आन्दोलन (जनाअन्दोलन-२) पश्चात् राजाले देशको सार्वभौमसत्ता जनतालाई हस्तान्तरण गरे तथा अप्रिल २४, २००६ मा भंग गरिएको संसद पूनर्स्थापित भयो । मे १८, २००६ मा आफूले पाएको सार्वभौमसत्ताको उपयोग गर्दै नयाँ प्रतिनिधि सभाले राजाको अधिकारमा कटौती गर्‍यो तथा नेपाललाई एक धर्मनिरपेक्ष राष्ट्र घोषणा गर्‍यो । अन्तरिम व्यवस्थापिका संसदले पहिले नै घोषणा गरिसकेको "सङ्घीय लोकतान्त्रिक गणराज्य, संविधानसभा" को पहिलो बैठकबाट मे २८, २००८ मा आधिकारिक रूपमा कार्यान्वयन भयो । नेपालको भूगोल सानो भए पनी नेपालीहरु को मन ठुलो छ । - -हिमालय क्षेत्रमा मानिसहरू बस्न थालेको कम्तिमा पनि ९,००० वर्ष भएको कुरा काठमाडौं उपत्यकामा पाइएका प्राचीन औजारहरूबाट पुष्टि हुन्छ। सम्भवत: भोट-बर्मेली मूलका मानिसहरू नेपालमा २,५०० वर्ष अगाडि बसोबास गर्दथे। - -ईशापूर्व १५०० तिर इन्डो-आर्यन जातिहरू उपत्यका प्रवेश गरे। ईशापूर्वको १००० तिर स-साना राज्यहरू र राज्यसङ्गठनहरू बने। सिद्धार्थ गौतम (ईशापूर्व ५६३–४८३) त्यस्तै एक वंश, शाक्यवंशका राजकुमार थिए, जसले आफ्नो राजकाज त्यागी तपस्वीको जीवन अँगाले र उनी बुद्ध भनेर विश्व प्रसिद्ध भए। -ईशापूर्वको २५० सम्ममा, यो क्षेत्र उत्तर'''; diff --git a/benchmarks/Utf8Encode/dart2/rutext_2_10k.dart b/benchmarks/Utf8Encode/dart2/rutext_2_10k.dart deleted file mode 100644 index 55295d7b487..00000000000 --- a/benchmarks/Utf8Encode/dart2/rutext_2_10k.dart +++ /dev/null @@ -1,46 +0,0 @@ -// This text is an extract from the Russian Wikipedia article about Lithuania -// (Литва): https://ru.wikipedia.org/wiki/Литва -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String ru = ''' -Литва - -Литва́ (), официальное название Лито́вская Респу́блика () государство, расположенное в северной части Европы. Столица страны Вильнюс. - -Площадь км². Протяжённость с севера на юг 280 км, а с запада на восток 370 км. Население составляет человек (сентябрь, 2019). Занимает 140-е место место в мире по численности населения и 121-е по территории. Имеет выход к Балтийскому морю, расположена на его восточном побережье. Береговая линия составляет всего 99 км (наименьший показатель среди государств Балтии). На севере граничит с Латвией, на юго-востоке с Белоруссией, на юго-западе с Польшей и Калининградской областью России. - -Член ООН с 1991 года, ЕС и НАТО с 2004 года, ОЭСР с мая 2018 года. Входит в Шенгенскую зону и Еврозону. - -Независимость страны провозглашена 11 марта 1990 года, а юридически оформлена 6 сентября 1991 года. . - -Этимология слова «Литва» точно не известна, при этом существует множество версий, ни одна из которых не получила всеобщего признания. Корень «лит» и его варианты «лет»/«лют» допускают различные толкования как в балтских и славянских, так и в других индоевропейских языках. Так, например, существуют созвучные топонимы на территории Словакии «"Lytva"» и Румынии «"Litua"», известные с XIXII веков. По мнению Е. Поспелова, топоним образован от древнего названия реки Летава (Lietavà от «лить», русское «Летаука»). Феодальное княжество, по землям которого протекала эта река, со временем заняло ведущее положение и название было распространено на всё государство. В «Повести временных лет» (XII век) упоминается этноним «литва», полностью совпадающий с названием местности «Литва» и по смыслу (территория, где живёт литва), и по форме. - -Поверхность  равнинная со следами древнего оледенения. Поля и луга занимают 57 % территории, леса и кустарники  30 %, болота  6 %, внутренние воды  1 %. - -Высшая точка  293,84 м над уровнем моря  холм Аукштояс (или Аукштасис калнас) в юго-восточной части страны, в 23,5 км от Вильнюса. - -Крупнейшие реки  Неман и Вилия. -Более 3 тыс. озёр (1,5 % территории): крупнейшее из них  Друкшяй на границе Латвии, Литвы и Белоруссии (площадь 44,8 км²), самое глубокое  Таурагнас, 61 м), самое длинное  Асвея длинной в 30 км у местечка Дубингяй. - -Климат переходный от морского к континентальному. Средняя температура зимой 5 °C, летом +17 °C. Выпадает 748 мм осадков в год. - -Полезные ископаемые: торф, минеральные материалы, строительные материалы. - -Территория современной Литвы была заселена людьми с конца XIX тысячелетия до н. э. Жители занимались охотой и рыболовством, использовали лук и стрелы с кремнёвыми наконечниками, скребки для обработки кожи, удочки и сети. В конце неолита (IIIII тысячелетия до н. э.) на территорию современной Литвы проникли индоевропейские племена. Они занимались земледелием и скотоводством, при этом охота и рыболовство оставались основными занятиями местных жителей вплоть до широкого распространения железных орудий труда. Индоевропейцы, заселившие земли между устьями Вислы и Западной Двины, выделились в отдельную группу, названную учёными балтами. - -Традиционно считается, что этническая основа Литвы сформирована носителями археологической культуры восточнолитовских курганов, сложившейся в V веке н. э. на территории современных Восточной Литвы и Северо-Западной Белоруссии. Около VII века литовский язык отделился от латышского. - -Становление государственности на территории современной Литвы относят к XIII веку, при этом само название «Литва» впервые упомянуто в Кведлинбургских анналах под 1009 годом в сообщении об убийстве язычниками миссионера Бруно на границе Руси и Литвы. По наиболее распространённой версии, топоним возник от названия небольшой реки Летаука, притока Няриса. Согласно более современной гипотезе, название страны могло произойти от этнонима «леты» или «лейти», которым жители окрестных земель называли дружинников литовских князей. - -В начале XIII века в земли балтов-язычников с запада началось вторжение немецких рыцарей-крестоносцев. Они покорили Пруссию и Ливонию. В это же время с юга началась экспансия Галицко-Волынского княжества. К середине XIII века многие литовские земли были объединены под властью князя Миндовга, принявшего в 1251 году католическое крещение и коронованного в 1253 году. Через несколько лет Миндовг отрёкся от христианства и до начала XIV века литовские земли оставались языческими. Несмотря на то, что уже в 1263 году Миндовг был свергнут, его правление положило начало более чем пятисотлетнему существованию Великого княжества Литовского. - -В XIV  начале XV веках территория Великого княжества Литовского стремительно росла, в основном за счёт присоединения земель Западной Руси. Включение в состав государства славянских земель, многократно превышающих по площади и количеству населения собственно литовские земли, привело к перениманию литовскими князьями, получившими во владение русские земли, православной культуры и западнорусского языка. Со временем западнорусский язык стал официальным языком канцелярии великих князей. Собственно литовский язык до XVI века оставался бесписьменным, хотя и продолжал использоваться на этнически литовских землях. - -В 1385 году великий князь литовский Ягайло заключил Кревскую унию с Королевством Польским. По условиям унии, Ягайло обязался присоединить Великое княжество Литовское к Королевству Польскому и крестить литовские земли по католическому обряду, а сам становился королём Польши и сохранял титул великого князя литовского. Однако вскоре он вынужден был уступить власть в Великом княжестве Литовском своему двоюродному брату Витовту.'''; diff --git a/benchmarks/Utf8Encode/dart2/sktext_10k.dart b/benchmarks/Utf8Encode/dart2/sktext_10k.dart deleted file mode 100644 index 198c2743858..00000000000 --- a/benchmarks/Utf8Encode/dart2/sktext_10k.dart +++ /dev/null @@ -1,48 +0,0 @@ -// This text is an extract from the Slovak Wikipedia article about Esperanto: -// https://sk.wikipedia.org/wiki/Esperanto -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String sk = ''' -Esperanto (pôvodne Lingvo Internacia – „medzinárodný jazyk“) je najrozšírenejší medzinárodný plánový jazyk. Názov je odvodený od pseudonymu, pod ktorým v roku 1887 zverejnil lekár L. L. Zamenhof základy tohto jazyka. Zámerom tvorcu bolo vytvoriť ľahko naučiteľný a použiteľný neutrálny jazyk, vhodný na použitie v medzinárodnej komunikácii. Cieľom nebolo nahradiť národné jazyky, čo bolo neskôr aj deklarované v Boulonskej deklarácii. - -Hoci žiaden štát neprijal esperanto ako úradný jazyk, používa ho komunita s odhadovaným počtom hovoriacich 100 000 až 2 000 000, z čoho približne 2 000 tvoria rodení hovoriaci. V Poľsku je na zozname nemateriálneho kultúrneho dedičstva. Získalo aj isté medzinárodné uznania, napríklad dve rezolúcie UNESCO či podporu známych osobností verejného života. V súčasnosti sa esperanto využíva pri cestovaní, korešpondencii, medzinárodných stretnutiach a kultúrnych výmenách, kongresoch, vedeckých diskusiách, v pôvodnej aj prekladovej literatúre, divadle a kine, hudbe, tlačenom aj internetovom spravodajstve, rozhlasovom a televíznom vysielaní. - -Slovná zásoba esperanta pochádza predovšetkým zo západoeurópskych jazykov, zatiaľ čo jeho skladba a tvaroslovie ukazujú na silný slovanský vplyv. Morfémy sú nemenné a je možné ich kombinovať takmer bez obmedzení do rozmanitých slov; esperanto má teda mnoho spoločného s analytickými jazykmi, ako je čínština, zatiaľ čo vnútorná stavba jeho slov pripomína jazyky aglutinačné, ako je japončina, swahilčina alebo turečtina. - -Pri zrode esperanta stál Ludwik Lejzer Zamenhof. Vyrastal v mnohojazyčnom, vtedy ruskom, teraz poľskom meste Białystok, kde bol svedkom častých sporov medzi jednotlivými národnosťami (Rusi, Poliaci, Nemci, Židia). Pretože za jednu z hlavných príčin týchto sporov považoval neexistenciu spoločného jazyka, začal už ako školák pracovať na projekte reči, ktorá by túto funkciu mohla plniť. Mala byť, na rozdiel od národných jazykov, neutrálna a ľahko naučiteľná, teda prijateľná ako druhý jazyk pre všetkých, jazyk vyučovaný spoločne s národnými jazykmi a používaný v situáciách vyžadujúcich dorozumenie medzi národmi. - -Zamenhof najskôr uvažoval o oživení latinčiny, ktorú sa učil v škole, ale usúdil, že je pre bežné dorozumievanie zbytočne zložitá. Keď študoval angličtinu, všimol si, že časovanie slovies podľa osoby a čísla nie je nutné; že gramatický systém jazyka môže byť oveľa jednoduchší, než sa dovtedy nazdával. Stále však zostávala prekážka v memorovaní sa veľkého množstva slov. Raz Zamenhofa zaujali dva ruské nápisy: "швейцарская" [švejcarskaja] (vrátnica, odvodené od "швейцар" [švejcar] – vrátnik) a "кондитерская" [konditerskaja] (cukráreň, odvodené od "кондитер" [konditér] – cukrár). Tieto slová rovnakého zakončenia mu vnukli myšlienku, že používanie pravidelných predpôn a prípon by mohlo významne znížiť množstvo slovných koreňov nutných na dorozumenie sa. Aby boli korene čo najmedzinárodnejšie, rozhodol sa prevziať slovnú zásobu predovšetkým z románskych a germánskych jazykov, teda tých, ktoré boli vtedy v školách po celom svete vyučované najčastejšie. -Prvý Zamenhofov projekt, nazvaný "Lingwe uniwersala," bol viac-menej hotový už v roku 1878, ale autorov otec, učiteľ jazykov, považoval túto prácu za márnu a utopistickú, a zrejme preto rukopis, ktorý mu bol zverený, zničil. V rokoch 1879 – 1885 Zamenhof študoval medicínu v Moskve a vo Varšave. V tej dobe začal znova pracovať na medzinárodnom jazyku. Prvú obnovenú verziu vyučoval v roku 1879 pre svojich priateľov. Po niekoľkých rokoch už prekladal poéziu, aby jazyk čo najviac zdokonalil. V roku 1885 autor napísal: - -Zamenhofovi prichádzalo veľa nadšených listov, ktoré často prinášali najrôznejšie návrhy úprav jazyka. Všetky podnety zaznamenával a neskoršie ich začal uverejňovať v časopise "Esperantisto", vychádzajúcom v Norimbergu. V tom istom časopise aj dal o úpravách dvakrát hlasovať, väčšina čitateľov však so zmenami nesúhlasila. Po týchto hlasovaniach na určitý čas utíchli hlasy volajúce po reforme a jazyk sa začal rozširovať. Najviac odberateľov mal časopis vo vtedajšom Rusku. Veľkou ranou preň bolo, keď ruská cenzúra jeho šírenie zakázala kvôli článku Leva Nikolajeviča Tolstého. Časopis kvôli tomu musel byť zrušený, krátko na to bol však vystriedaný novým, nazvaným "Lingvo Internacia." Najskôr ho redigovali vo švédskej Uppsale, neskôr v Maďarsku a nakoniec v Paríži, kde jeho vydávanie zastavila až prvá svetová vojna. - -Nový medzinárodný jazyk začali jeho používatelia skoro používať aj na organizáciu odbornej a záujmovej činnosti na medzinárodnej úrovni. V prvých desaťročiach prebiehala komunikácia v esperante takmer výhradne písomnou formou. Ale po nečakane úspešnom prvom Svetovom kongrese esperanta, usporiadanom v roku 1905 vo francúzskom meste Boulogne-sur-Mer, na ktorom sa overili možnosti používania tejto reči v hovorenej forme, začali naberať na intenzite aj osobné kontakty. - -Esperanto začali pre svoju činnosť používať aj rôzne organizácie a hnutia. Už na svetovom kongrese v Barcelone roku 1909 sa uskutočnilo niekoľko stretnutí prítomných katolíkov, ktorí sa nakoniec rozhodli usporiadať v nadchádzajúcom roku, 1910, samostatný kongres katolíckych esperantistov. Počas neho bolo založené Medzinárodné združenie katolíckych esperantistov (IKUE – Internacia Katolika Unuiĝo Esperantista). Časopis "Espero Katolika" ("Katolícka nádej") vychádzal už od roku 1903 a s viac ako 100 rokmi svojej existencie je dnes najdlhšie vychádzajúcim esperantským periodikom. - -V roku 1912 sa Zamenhof pri slávnostnom prejave ôsmeho Svetového kongresu esperanta v Krakove vzdal svojej oficiálnej úlohy v hnutí. Desiaty kongres sa mal konať v roku 1914 v Paríži, prihlásilo sa naň takmer 4 000 ľudí, ale nakoniec ho zrušili pre začínajúcu vojnu, Zamenhof sa vtedy musel vrátiť domov cez škandinávske štáty. - -Po vojne túžba po harmónii a mieri vzbudila nové nádeje, vďaka čomu sa esperanto veľmi rýchlo šírilo. Prvý povojnový kongres sa konal v roku 1920 v Haagu, 13. svetový kongres v 1921 v Prahe. V roku 1927 bolo vo viedenskom Hofburgu otvorené Medzinárodné esperantské múzeum, v roku 1929 bolo pripojené k Rakúskej národnej knižnici a dnes sídli v samostatnej budove. - -Snahy o presadenie esperanta ako univerzálneho jazyka sa stretávali s pozitívnou odozvou: Petíciu v jeho prospech adresovanú Organizácii Spojených národov podpísalo vyše 80 miliónov ľudí, v Česko-Slovensku napríklad prof. Jaroslav Heyrovský, nositeľ Nobelovej ceny. - -Valné zhromaždenie UNESCO prijalo podobné rezolúcie v Montevideu 10. decembra 1954 a v Sofii 8. novembra 1985. Vzalo v nich na vedomie "výsledky dosiahnuté esperantom na poli medzinárodnej duchovnej výmeny aj zblíženia národov sveta" a vyzvalo členské štáty, "aby sa chopili iniciatívy pri zavádzaní študijných programov o jazykovom probléme a esperante na svojich školách a inštitúciách vyššieho vzdelávania". - -K esperantu sa hlásila aj rada predsedov Poľskej akadémie vied. Jubilejného 72. Svetového kongresu esperanta roku 1987 (100. výročie uverejnenia prvej učebnice jazyka) sa vo Varšave zúčastnilo takmer 6 000 ľudí zo 60 národov. - -Pokroky dosiahli aj katolícki esperantisti – roku 1990 bol vydaný dokument "Norme per la celebrazione della Messa in esperanto", ktorým Svätá stolica povoľuje vysluhovať sväté omše v tomto jazyku bez zvláštneho povolenia. Esperanto sa tak stalo jediným schváleným umelým liturgickým jazykom katolíckej cirkvi. - -Skutočnosť, že mnohé z cieľov esperantského hnutia sa doteraz nepodarilo naplniť, je často prisudzovaná okrem iného technologickej a kultúrnej dominancii Spojeného kráľovstva a Spojených štátov amerických, predovšetkým v období po druhej svetovej vojne, vďaka čomu je v súčasnosti dorozumievacím jazykom väčšiny medzinárodných činností angličtina. - -Už na začiatku 20. storočia bolo na území dnešného Slovenska (vtedy severná časť Uhorska) činné esperantské hnutie. Esperantistov a kluby zastrešovala „Uhorská esperantská spoločnosť” a „Verda Standardo”. V Prahe boli činné spolky "Bohema Unio Esperantista", ktorý prijímal len organizácie a kluby, a "Bohema Asocio Esperantista", ktorý prijímal jednotlivcov. Oba spolky vydávali svoje časopisy. V roku 1907, 20 rokov po zverejnení jazyka Zamenhofom, vydal tolstojovec Albert Škarvan spolu s Rusom N. P. Evstifejevom prvú učebnicu esperanta v slovenčine, „Základy medzinárodnej reči ESPERANTO“. - -Po prvej svetovej vojne sa oba pražské spolky zlúčili do "Československej Esperantskej Asociácie". Tá bola v roku 1936 premenovaná na "Esperantskú Asociáciu v Československej republike". V tomto období bolo hnutie veľmi aktívne, fungovalo mnoho klubov, konalo sa veľa prednášok a kurzov. Esperanto bolo vyučované na školách rôznych stupňov, rádio Bratislava od 1930 vysielalo kurzy a od 1932 aj kultúrny program v esperante. Bola vydaná "Československá antológia" predstavujúca diela 20 slovenských autorov. V rámci protifašistickej aktivity vychádzali aj preklady protifašistických článkov z esperantských časopisov z obdobia Španielskej občianskej vojny. - -Druhá svetová vojna utlmila esperantské hnutie. Bratislavský esperantský klub požiadal o zmenu štatútu a rozšírenie poľa pôsobnosti na celú vtedajšiu Slovenskú republiku a následne sa stal strediskom esperantského hnutia na Slovensku.'''; diff --git a/benchmarks/Utf8Encode/dart2/zhtext_10k.dart b/benchmarks/Utf8Encode/dart2/zhtext_10k.dart deleted file mode 100644 index 20e50d9c912..00000000000 --- a/benchmarks/Utf8Encode/dart2/zhtext_10k.dart +++ /dev/null @@ -1,75 +0,0 @@ -// This text is an extract from the Chinese Wikipedia article about Kanji -// (汉字): https://zh.wikipedia.org/wiki/汉字 -// -// The extract is based on the Wikipedia database dump. All markup has been -// removed using WikiExtractor: https://github.com/attardi/wikiextractor -// -// The material is licensed under the Creative Commons Attribution-Share-Alike -// License 3.0: https://creativecommons.org/licenses/by-sa/3.0/ - -// @dart=2.9 - -const String zh = ''' -最簡單的漢字只有一笔画,但卻不止一個字:除了「一」字以外,「乙」、「〇」、「丶」、「丨」、「亅」、「丿」、「乀」、「乁」、「𠄌」、「𠃋」、「𠃉」、「𠃊」、「乚」等都是漢字,而且都有各自的讀音。 - -中文汉字中,笔画最多的汉字可能是“”,是一种面食的名称,此字至今习用,其不同写法的笔画数在54至71画之间不等。被传统辞典收录的笔画最多的汉字为《字汇补》、《汉语大字典》中由四个“-{龍}-”字组成的「」字,共64画;同樣屬於64劃的字由四個“-{興}-”字組成的“𠔻”字,收入自《中文大辭典》;之後的是由四個「雷」字組成的“䨻”字,有52劃,收錄於《說文解字》。 - -另外,日本汉字「」收录于日本的TRON计划中,但此字无法提供有效证据表明其确有使用,因此状况存疑。该字由3個「-{龍}-」字和3個「-{雲}-」個組合而成,共有84劃。该字曾提交到当时的统一码扩展C区,编号为JMK66147,后因扩展C区的时间原因被安排到了扩展D区,之后因找不到合适证据被撤销。最后提交到扩展G区并被接受。 - -現在,純漢字僅僅被用於記錄漢語。而漢字和假名一起被用於記錄日語。 - -其他一些民族在早期會將漢字單純作為表音文字來記錄他們的語言。如蒙古語最早的文獻蒙古秘史即用純漢字當做表音文字進行記錄。日語最早的文獻也是把漢字當做表音文字來記錄日語,後來演變出萬葉假名。 - -契丹文、女真文、西夏文的創製受到了漢字的影響,它們跟漢字一樣都是方塊型文字,筆畫形狀也極其類似,也採用類似六書的造字法。但這些文字除個別字與漢字外形相同外,絕大部分字形都跟漢字不同,因此在Unicode中它們都是獨立區塊編碼的。 - -古壯字(方塊壯字)、古白字(方塊白字)、古布依字(方塊布依字)、字喃等文字可以說是漢字在其他語言中的擴充,因為它們很大一部分本身就是漢字(賦予新義),另一些則是用已有漢字偏旁組合構成新字,因此,這些文字的外觀上與漢字很相似,在Unicode中與漢字一道編入漢字區。 - -女書是用於記錄漢語的另一種文字,它們的造字法與六書有部分相似之處,但字的外觀與漢字差異較大,Unicode中作為獨立區塊編碼。 - -以上文字都因各種原因而消亡,如今除專家學者外無幾人能識。 - -日語的假名()是由漢字的草體、簡筆演變而成的。諺文和日語假名一樣可以和漢字一同混寫。 - -此外如蒙古文、滿文、錫伯文等也是在漢字書寫方式和書寫工具的影響下,將從右向左書寫的源自察合台文的書寫方式改為從上到下書寫,文字的結構也隨之有所變化。 - -漢字是承載文化的重要工具,目前留有大量用漢字書寫的典籍。不同的方言、甚至語言都使用漢字作為共同書寫體系。在古代日本、朝鮮半島、越南、琉球群島,以及位於婆羅洲的蘭芳共和國,漢字都曾是該國正式文書的唯一系統,因而漢字在歷史上對文明的傳播分享有著重要作用。 - -由於漢字和發聲的聯繫不是非常密切,比較容易被其他民族所借用,如日本、朝鮮半島和越南都曾經有過不會說漢語,單純用漢字書寫的歷史階段。漢字的這個特點對於維繫一個文化圈—一個充滿各種互相不能交流的方言群體的民族——發揮了主要的作用。 - -漢字對周邊國家的文化產生過巨大的影響,形成了一個共同使用漢字的漢字文化圈,在日本、越南和朝鮮半島、琉球群島,漢字被融合成它們語言的文字「」、「」、「」。直到現在,日語中仍然把漢字認為是書寫體系的一部分。在北韓和越南,已經完全不再使用漢字;在韓國,漢字的使用在近幾十年來越來越少;但是由於朝鮮語/韓語中使用了大量的漢字詞彙,並且重音現象嚴重,所以在需要嚴謹表達的場合時仍然會使用漢字。雖然在通常情況下人名、公司機構名稱等均使用韓文書寫,不過大多數的人名、公司機構均有其對應的漢字名稱。 - -漢字於公元3世紀經朝鮮半島輾轉傳入日本。二戰後日本開始限制漢字的數量和使用,頒布了《當用漢字表》及《人名用字表》等,其中簡化了部分漢字(日本新字體),不過文學創作使用的漢字,並不在限制之列。日本除從中文中傳入的漢字外,還創造和簡化了一些漢字,如「-{辻}-」(十字路口)、「-{栃}-」、「-{峠}-」(山道)和「-{広}-」(廣)、「-{転}-」(轉)、「-{働}-」(勞動)等。 - -公元3世紀左右,漢字傳入了朝鮮半島,朝鮮語/韓語曾經完全使用漢字來書寫。相傳薛聰在當時發明了吏讀,把朝鮮語用同音或同義的漢字來表示。例如:「乙」字被用來表示韓語中的後綴「-l()」。由於有不少發音都沒有對應的漢字,所以朝鮮半島的人民又運用組字法,把兩個或多個漢字合組成為一個新的吏讀字。相傳後來的契丹文就是受到吏讀字的影響。此外尚有鄉札、口訣等以漢字表記朝鮮語的方法。 - -1443年,朝鮮世宗大王頒布《訓民正音》,發明了諺文與漢字一起使用,但當中有不少部件仍然有昔日吏讀字的痕跡。現在的大韓民國雖禁止在正式場合下使用漢字,並停止了在中小學中教授漢字(但是從2011年開始,大韓民國的李明博政府已經決定將漢字重新納入中小學的課程裡),不過漢字在民間仍在繼續使用,且可以按照個人習慣書寫,但是現在能寫一筆漂亮漢字的韓國人越來越少。朝鮮民主主義人民共和國於1948年廢除了漢字,僅保留了十幾個漢字(參見廢除漢字)。 - -公元1世紀漢字便傳入了越南,越南語也曾完全使用漢字做為書寫用文字,並在漢字的基礎上創造了喃字,但是由於書寫不便,漢字仍是主要的書寫方式。 - -1945年越南民主共和國成立後廢除漢字,使用了稱為「國語字」的拼音文字。現在的越南文已經看不出漢字的痕跡了。 - -中國許多民俗都與漢字有關,例如: - -漢字獨特優美的結構,書寫的主要工具——毛筆有多樣的表現力,因而產生了中文獨特的造型藝術——書法。而篆刻是和書法相關的藝術,用刀在石材上雕刻出篆字作為印章,尚有勒石、山壁題字等。 -同一个汉字,可以有不同的字体。當前漢字字體主要有篆書、隷書、草書、行書、楷書等。 - -漢字歷史上是不斷在組新字的,目前的各種漢字並非同时定型于某一年代,而是應時代需要逐渐發展而来的。例如:“人”字在商朝就已出现,“凹”字和“凸”字則是在唐朝才出現的。 - -此外不同的行業也会因用字需求而造字。例如:中国的傳統音乐在記譜上會使用減字譜、工尺譜。 - -自十九世紀中葉後,亞洲和西方都發佈了很多漢字拉丁化方案,如: - -現在,漢語拼音方案是使用最廣且被聯合國接受的汉字拉丁化方案。而威妥瑪拼音歷史悠久,至今仍用於臺灣的人名、地名拼寫。 -汉字中存在许多异体字,它们的意义和读音完全相同,只是写法不同。异体字的产生部分是由于历史原因,有的则是人为造字,如「和、咊、-{龢}-」、「秋、-{秌}-、龝」等。 - -臺灣也有使用所謂的異體字,例如“-{臺}-”與“-{台}-”、“-{體}-”與“-{体}-”以及“-{學}-”與“-{学}-”等等。 - -中国大陆於1956年公布整理异体字表,废除了大量异体字,但後來因為各種原因恢復了部分異體字。如“-{於}-”曾被當作“-{于}-”的異體字廢除掉,但在1988年發表的《現代漢語通用字表》中又恢復成為規範字,因爲姓氏中「-{于}-」和「-{於}-」同時存在,不宜合併。另外,不同地區對異體字的取捨有所不同,例如:韓國就以漢字各種異體字中最早出現的樣式為標準寫法。所以,在韓語漢字的標準中,取“甛”而不取“甜”、取“-{幇}-”而不取“-{幫}-”、取“-{畵}-”而不取“-{畫}-”。 - -由于英文文字是由26个字母排列组合而成的文字,因此可以简化输入步骤;相比较之下汉字则不能如此,从字形上汉字虽然可以拆解成不同的部分,但是被分成的部首或偏旁数量过多,这样不但不能达到简化输入的目的,反而显得更为繁琐。于是从汉字字音上去考虑,汉字输入被分成少量的语音元素组合排列,反而可以达到简化输入的步骤。因为是语音输入对汉字的读音必须清楚,某些生僻字或不知道汉字发音的则会很困难,这在一定程度上限制了汉字的输入。 - -由于打字機鍵盤是為歐美文字設計的,在設計時本身沒有考慮汉字輸入的問題,輸入漢字往往比輸入拼音文字困難。汉字没有经过中文打字機的普及,直接进入了電腦中文信息处理阶段。在電腦發明初期曾引起漢字能否適應電腦時代的問題,支持漢字拉丁化的學者甚至以此為理據。 - -随着各种中文输入法的出现,汉字的计算机输入、存储、输出技术得到了基本解决,大大提高了中文写作、出版、信息检索等的效率。目前中文输入法有上千种之多,主要包括表音输入和表形输入两类,也有两者兼之的。汉字的语音输入、手写识别和光学字符识别(OCR)技术也已得到广泛应用。 - -如收录数千字的GB 2312(中國大陸)、B'''; diff --git a/benchmarks/analysis_options.yaml b/benchmarks/analysis_options.yaml index 16ed5a3df51..40d26519b99 100644 --- a/benchmarks/analysis_options.yaml +++ b/benchmarks/analysis_options.yaml @@ -3,8 +3,6 @@ # BSD-style license that can be found in the LICENSE file. analyzer: - exclude: - - '*/dart2/' # These don't analyze cleanly on newer sdks # strong-mode: # implicit-casts: false linter: