Quale lingua dovrei usare per un programma ad alta intensità di calcolo? [chiuso]

5

Questa è una domanda in più parti. Sto scrivendo un programma intensivo dal punto di vista computazionale che eseguirà calcoli su numeri molto grandi, sulla scala del fattoriale (100). Sto considerando di utilizzare Java o C ++ (questo è tutto quello che so, e C ++ solo leggermente), ma non sono sicuro di quale sarebbe meglio usare in questo contesto.

So che il C ++ sarà più veloce, ma Java ha un'utilità integrata per grandi numeri, la classe BigInteger, e non conosco alcun equivalente in C ++. Quindi ecco le domande ...

  1. Il C ++ è molto più veloce di java, per cui vale la pena imparare e trovare un modo per gestire grandi numeri?
  2. Se dovessi usare C ++, come gestirò i grandi numeri?
  3. È possibile specificare solo un nuovo tipo di dati in C ++ che rappresenta un numero, ma con limiti maggiori rispetto a int?
posta Ryan Stull 11.07.2011 - 22:46
fonte

5 risposte

10

Controlla GNU MP . Ha un'interfaccia basata sulla classe C ++ se la C è troppo spaventosa. Per quanto riguarda il confronto della velocità, prenderei seriamente in considerazione la velocità del programmatore qui. Se ci vorrà un mese in più per farlo "nel modo più veloce" per un programma one-shot a causa della non familiarità con la lingua, non mi preoccuperei.

    
risposta data 11.07.2011 - 23:20
fonte
2

Is c++ so much faster than java as to make it worth it to learn and find a way to handle large numbers?

Le prestazioni sono un punto critico? Hai bisogno di eseguire calcoli con requisiti di tempismo? Se è così, allora C o C ++ sarebbe la scelta più ovvia.

Altrimenti, data la tua familiarità con Java, potrebbe essere una buona idea usarlo.

Potresti anche prendere in considerazione qualcosa come OCaml, che capisco abbia una libreria bigint veloce. Vale la pena di studiare lo stesso e altri linguaggi funzionali, quindi questa è una buona scusa come qualsiasi. :)

If I should use c++, how would I handle the large numbers?

La maggior parte delle persone usa semplicemente GNU MP. È una libreria molto solida, ed è abbastanza veloce.

Is it possible to just specify a new data type in c++ that represents a number, but with larger bounds than the int?

Sì. In effetti, è possibile definire una classe in C ++ che guarda e si comporta in modo identico a un tipo nativo (con alcune limitazioni) piuttosto facilmente. Quasi tutti gli operatori che useresti con esso possono essere sovraccaricati e hai un grande controllo sul comportamento di questi operatori.

Naturalmente, con questo potere arriva un certo numero di trucchi, quindi dovresti preferire fare affidamento su una libreria esistente.

    
risposta data 12.07.2011 - 01:41
fonte
0

Questo è un one-off o un programma che verrà usato ripetutamente da molte persone?

Se il primo, potresti considerare wsMaxima o Lisp (R o Matlab forse?), un linguaggio che gestisce i bigin in modo naturale. Il supporto integrato dovrebbe essere molto veloce.

Altrimenti, Java o C ++ sarebbero migliori.

Sto basandomi sul concetto che la cosa più importante sarà la performance del pacchetto bigint stesso. Fare l'aritmetica di base su queste cose potrebbe essere il tuo più grande capriccio del tempo, quindi vorrai che il pacchetto bigint sia il più veloce possibile. Suppongo che il codice "wrapper" al di fuori della classe bigint non spenderebbe una percentuale così alta di tempo, rispetto al tempo trascorso in classe.

Se la classe Java o la classe C ++ sia più veloce, è necessario testarla, con cose come 100! .

    
risposta data 11.07.2011 - 23:39
fonte
0

IMO, dipende principalmente dalla / e lingua / e che già conosci. Se conosci già qualcosa come Lisp che supporta nativamente interi di grandi dimensioni, allora questa è una scelta ovvia.

Altrimenti, ottenere e utilizzare una grande libreria di interi è generalmente abbastanza facile da renderlo più facile da scaricare / utilizzare uno rispetto a passare a una lingua diversa solo per quella funzione. Ad esempio, se sei abituato a usare C ++, calcolando 100! con NTL di Victor Shoup sembra qualcosa del genere:

#include <iostream>
#include "NTL/zz.h"

int main() { 
    NTL::ZZ result, i;

    for (result = 1, i=2; i<=100; i++)
        result *= i;
    std::cout << result;
    return 0;
}

In breve, si aggiunge un'intestazione e si modifica il tipo di dati, ma in caso contrario il codice può essere scritto essenzialmente come se si stesse usando int.

Tra C ++ e Java, vorrei (prevedibilmente, suppongo) consigliare C ++. Come dimostra il codice sopra, la maggior parte delle librerie bigint per C ++ usa l'overloading dell'operatore per rendere il lavoro con esse simile al normale con int s, ecc.

Nonostante sia fornito come parte della normale distribuzione Java, lo stesso è non vero della classe BigInteger di Java. In Java, devi usare la notazione delle funzioni membro per qualsiasi cosa, quindi result *= i diventa qualcosa come result.assign(result.multiply(i)); (è passato un po 'di tempo dall'ultima volta che l'ho usato, quindi probabilmente mi ricordo che i nomi sono un po' sbagliati, ma hai un'idea generale ).

    
risposta data 12.07.2011 - 00:36
fonte
0

Ricorda che le classi numeriche di Java sono immutabili, il che significa che potresti creare e scartare un gran numero di esse, che dovranno quindi essere raccolte automaticamente. Se sono tutti di breve durata e date al vostro programma abbastanza spazio per l'heap, probabilmente non sarà un problema, ma è una potenziale area problematica. Ma se ti senti più a tuo agio con Java, e il tuo codice computazionale verrà chiamato abbastanza spesso per ottenere JITted, allora è possibile che Java sia abbastanza veloce (per valori adeguati di "abbastanza", ovviamente).

    
risposta data 12.07.2011 - 01:14
fonte

Leggi altre domande sui tag