Soy nuevo en C# y he estado jugando con él. Implementé un tipo de burbuja en C# esperando que fuera más rápido que JavaScript, ya que es un lenguaje compilado, pero obtengo velocidades mucho más lentas.
Estoy clasificando 100.000 números.
En C# obtengo una velocidad de aproximadamente: 1 minuto y 30 segundos
Código C#:
using System.Diagnostics; public class Program { public static void Main(string[] args) { List<int> randoms = generateRandoms(0, 1000000, 100000); Console.WriteLine(randoms.Count); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); bubbleSort(randoms); stopWatch.Stop(); TimeSpan timeSpan = stopWatch.Elapsed; Console.WriteLine("Total processing time... {0:00}:{1:00}:{2:00}.{3:000}", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds); Console.Read(); } static List<int> generateRandoms(int min, int max, int amount) { Random rnd = new Random(); List<int> randoms = new List<int>(); for (int i = 0; i < amount; i++) { int r = rnd.Next(min, max+1); randoms.Add(r); } return randoms; } static List<int> bubbleSort(List<int> list) { //Bubble sort for (int i = 0; i < list.Count; i++) { for (int j = 0; j < list.Count - i - 1; j++) { if (list[j] > list[j+1]) { int temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } } return list; } static void print(List<int> list) { for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } } }
En JavaScript obtengo aproximadamente: 30 segundos
Código JavaScript:
function bubbleSort(array) { for (let i = 0; i < array.length; i++) { for (let j = 0; j < array.length-i-1; j++) { if (array[j] > array[j+1]) { [array[j], array[j+1]] = [array[j+1], array[j]]; } } } } function generateRandoms(min, max, n) { const arr = []; for (let i = 0; i < n; i++) { arr.push(Math.floor(Math.random() * (max-min+1) + min)); } return arr; } const array = generateRandoms(0, 1000000, 100000); console.log(array.length); const start = new Date(); bubbleSort(array); const end = new Date(); console.log(`Performance: ${end - start}ms`);
Supuse que tenía que ver con la estructura de datos "Lista" en C#, pero después de mirar la documentación, parece que todas las operaciones que estoy usando en la función bubbleSort son O(1)
¿Alguien tiene una idea de por qué las velocidades son mucho peores en C# para mí? Estoy usando .Net v6.0.201. También estoy usando VSCode para ambos programas.
Supuse que tenía que ver con la estructura de datos "Lista" en C#, pero después de mirar la documentación, parece que todas las operaciones que estoy usando en la función bubbleSort son O(1)
O(1) no es necesariamente rápido , es simplemente constante. Cambiar el código C# para usar una matriz duplica aproximadamente su velocidad. No estoy seguro exactamente por qué es eso (List usa arreglos debajo del capó), pero los arreglos IIRC a veces pueden eludir las comprobaciones de límites.
Además, su intercambio de C# está haciendo un poco más de trabajo que su intercambio de JS; puedes reemplazar esto:
int temp = list[j]; list[j] = list[j+1]; list[j+1] = temp;
con este:
(list[j], list[j+1]) = (list[j+1], list[j]);
Los dos idiomas están más cerca después de esos cambios, pero JS aún gana; No estoy seguro de por qué.
Actualización: C# es más rápido para mí si recuerdo compilar en modo Release.
C# es tan rápido, si no un poco más rápido, que JS cuando se construye en modo de lanzamiento . Al menos en mi computadora.
Total processing time... 00:01:00.611
: bandeja de depuración
Total processing time... 00:00:19.586
: bandeja de liberación