Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

256
Visualizações
¿Por qué la función BigInteger.ModPow en C# es mucho más lenta que en Java?

Descubrí que la función BigInteger.ModPow en C# es muy lenta en comparación con la función BigInteger.modPow en Java. Esto me hace reacio a usar C# para implementar funciones que realicen exponenciación modular.

He escrito un programa de prueba para demostrarlo.

C#

 static void Main(string[] args) { BigInteger num = BigInteger.Parse("444266014606582911577255360081280172978907874637194279031281180366057"); BigInteger m = 2; Console.WriteLine("Start multiply."); Stopwatch stopwatch = Stopwatch.StartNew(); for (int i = 3; i <= 200000; i++) m *= i; stopwatch.Stop(); Console.WriteLine(stopwatch.ElapsedMilliseconds); stopwatch.Reset(); Console.WriteLine("Start mod pow."); stopwatch.Start(); for (int i = 0; i < 10; i++) BigInteger.ModPow(3, m, num); stopwatch.Stop(); Console.WriteLine(stopwatch.ElapsedMilliseconds); }

Un programa equivalente en Java

 public static void main(String[] args) { BigInteger num = new BigInteger("444266014606582911577255360081280172978907874637194279031281180366057"); BigInteger m = BigInteger.TWO; System.out.println("Start multiply."); long startTime = System.currentTimeMillis(); for (int i = 3; i <= 200000; i++) m = m.multiply(BigInteger.valueOf(i)); System.out.println(System.currentTimeMillis() - startTime); System.out.println("Start mod pow."); startTime = System.currentTimeMillis(); for (int i = 0; i < 10; i++) BigInteger.valueOf(3).modPow(m, num); System.out.println(System.currentTimeMillis() - startTime); }

El programa consta de 2 partes:

  1. Calcula 200000! para producir un número muy grande m .
  2. Calcula 3^ m mod num 10 veces.

Puede cambiar los números o el conteo de bucles para intentar encontrar resultados diferentes.

Aquí hay un resultado de ejecución en mi computadora.

Especificaciones

  • CPU: CPU Intel(R) Core(TM) i3-8100 a 3,60 GHz
  • Versión .NET: .NET 6.0.102
  • Versión de Java: 17.0.1

C#

Empieza a multiplicar.
19443
Inicie mod pow.
35292

Java

Empieza a multiplicar.
14668
Inicie mod pow.
3462

Muestra que la función BigInteger.ModPow en C# es unas 10 veces más lenta que la de Java. ¿Alguien sabe el motivo? ¿Es eso un error?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Puede echar un vistazo a la implementación de .Net aquí y las de Java aquí .
Parece que los de Java fueron más estudiados.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda