Un enlace a una prueba comparativa en DartPad que ejecuta código Dart y lo compila en JavaScript.
https://dartpad.dev/?id=e110b8bc0ad72298517fb286d21bccdc
El código de prueba es simple
void _test1(int count) { final source = ' 123 '; for (var i = 0; i < count; i++) { var x = source.startsWith('123', 1); } } void _test2(int count) { final source = ' 123 '; for (var i = 0; i < count; i++) { var ok = source.codeUnitAt(1) == 0x31 && source.codeUnitAt(2) == 0x32 && source.codeUnitAt(3) == 0x33; var x = ok; } }Resultados para JavaScript:
Time passed: 0.000, Test 'startsWith': 105.4 ms Time passed: 0.106, Test 'codeUnitAt': 87.8 ms Time passed: 0.194, Test 'startsWith': 86.7 ms Time passed: 0.280, Test 'codeUnitAt': 87.101 ms Time passed: 0.368, Test 'startsWith': 87 ms Time passed: 0.455, Test 'codeUnitAt': 87.2 ms Time passed: 0.542, Test 'startsWith': 86.699 ms Time passed: 0.629, Test 'codeUnitAt': 85.6 ms Time passed: 0.715, Test 'startsWith': 85.7 ms Time passed: 0.801, Test 'codeUnitAt': 86.6 msSin preguntas.
Resultados para dardo (JIT):
Time passed: 0.000, Test 'startsWith': 837.2 ms Time passed: 0.842, Test 'codeUnitAt': 125.094 ms Time passed: 0.968, Test 'startsWith': 924.482 ms Time passed: 1.892, Test 'codeUnitAt': 131.861 ms Time passed: 2.024, Test 'startsWith': 736.603 ms Time passed: 2.761, Test 'codeUnitAt': 76.636 ms Time passed: 2.838, Test 'startsWith': 792.341 ms Time passed: 3.631, Test 'codeUnitAt': 61.732 ms Time passed: 3.693, Test 'startsWith': 721.816 ms Time passed: 4.415, Test 'codeUnitAt': 73.93 ms85,7 ms frente a 721,816 ms
Estos resultados plantean una gran cantidad de preguntas y la principal es: "¿Por qué startsWith es tan lento en comparación con JavaScript? ¿Cuál es la razón?"
Su prueba muestra que Google Chrome es excelente para detectar funciones que no hacen nada y/o funciones que terminan con el mismo resultado dado el mismo valor de entrada.
En general, es bastante difícil hacer este tipo de pruebas comparativas en las que queremos que se realice alguna optimización, pero no demasiada, ya que corremos el riesgo de optimizar lo que queríamos probar.
Por ejemplo, su bucle for interno simplemente está recorriendo los mismos datos y guarda el resultado en una variable local no utilizada. Cuanto más inteligente es el compilador, más termina deshaciéndose.
Entonces, la pregunta rápidamente se convierte en: "¿qué es lo que realmente queremos probar aquí?"
La prueba actual muestra con certeza que Dart VM es peor que Chrome cuando se trata de optimizar las funciones para no hacer básicamente nada.
Si, en cambio, cambiamos la prueba para que tanto Chrome como Dart VM sean menos predecibles (y, por lo tanto, realicemos menos optimizaciones), podríamos intentar algo como esto:
Random _rnd = Random(); void _test1(int count) { final source = ' 123 '; var x = false; for (var i = 0; i < count; i++) { x = source.startsWith('123', _rnd.nextBool() ? 0 : 1); } print(x); } Luego Chrome regresa (he eliminado los resultados de codeUnitAt ):
true Time passed: 0.000, Test 'startsWith': 3531 ms false Time passed: 3.531, Test 'startsWith': 3498 ms false Time passed: 7.029, Test 'startsWith': 3289 ms true Time passed: 10.319, Test 'startsWith': 3316 ms true Time passed: 13.635, Test 'startsWith': 3266 msY dardo VM:
false Time passed: 0.000, Test 'startsWith': 2119 ms false Time passed: 2.121, Test 'startsWith': 1901 ms true Time passed: 4.023, Test 'startsWith': 2012 ms true Time passed: 6.035, Test 'startsWith': 1998 ms false Time passed: 8.033, Test 'startsWith': 2009 msY Dart compilado en un archivo exe:
false Time passed: 0.000, Test 'startsWith': 1364 ms true Time passed: 1.365, Test 'startsWith': 1360 ms true Time passed: 2.726, Test 'startsWith': 1369 ms false Time passed: 4.095, Test 'startsWith': 1355 ms false Time passed: 5.451, Test 'startsWith': 1362 ms También se puede ver algo similar si cambiamos la prueba codeUnitAt .