Je tente de créer un bit de code bien optimisé pour créer un nombre de chiffres X de longueur (où X est lu à partir d'un fichier de propriétés d'exécution), basé sur un numéro de séquence généré par DB (Y), qui est ensuite utilisé un nom de dossier lors de l'enregistrement d'un fichier.Le moyen le plus rapide d'ajouter un nombre de chiffres à Java dans un certain nombre de chiffres
Je suis venu avec trois idées à ce jour, le plus rapide qui est le dernier, mais j'apprécierais tout les conseils peuvent avoir sur ce ...
1) instancier un StringBuilder avec initial capacité X. Ajouter Y. Pendant la longueur < X, insérer un zéro à pos zéro.
2) Instancier un StringBuilder avec la capacité initiale X. Pendant la longueur < X, ajoutez un zéro. Créez un DecimalFormat basé sur la valeur StringBuilder, puis formatez le nombre lorsque cela est nécessaire.
3) Créez un nouvel int de Math.pow (10, X) et ajoutez Y. Utilisez String.valueOf() sur le nouveau numéro, puis sous-chaîne (1) it.
La seconde peut évidemment être divisée en sections de boucle extérieure et intérieure.
Alors, des conseils? En utilisant une boucle de 10 000 itérations, je reçois des timings similaires à ceux des deux premiers, et la troisième méthode est environ dix fois plus rapide. Est-ce que cela semble correct?
code méthode de test complet ci-dessous ...
// Setup test variables
int numDigits = 9;
int testNumber = 724;
int numIterations = 10000;
String folderHolder = null;
DecimalFormat outputFormat = new DecimalFormat("#,##0");
// StringBuilder test
long before = System.nanoTime();
for (int i = 0; i < numIterations; i++)
{
StringBuilder sb = new StringBuilder(numDigits);
sb.append(testNumber);
while (sb.length() < numDigits)
{
sb.insert(0, 0);
}
folderHolder = sb.toString();
}
long after = System.nanoTime();
System.out.println("01: " + outputFormat.format(after - before) + " nanoseconds");
System.out.println("Sanity check: Folder = \"" + folderHolder + "\"");
// DecimalFormat test
before = System.nanoTime();
StringBuilder sb = new StringBuilder(numDigits);
while (sb.length() < numDigits)
{
sb.append(0);
}
DecimalFormat formatter = new DecimalFormat(sb.toString());
for (int i = 0; i < numIterations; i++)
{
folderHolder = formatter.format(testNumber);
}
after = System.nanoTime();
System.out.println("02: " + outputFormat.format(after - before) + " nanoseconds");
System.out.println("Sanity check: Folder = \"" + folderHolder + "\"");
// Substring test
before = System.nanoTime();
int baseNum = (int)Math.pow(10, numDigits);
for (int i = 0; i < numIterations; i++)
{
int newNum = baseNum + testNumber;
folderHolder = String.valueOf(newNum).substring(1);
}
after = System.nanoTime();
System.out.println("03: " + outputFormat.format(after - before) + " nanoseconds");
System.out.println("Sanity check: Folder = \"" + folderHolder + "\"");
Soyez prudent avec microbenchmarking la JVM: http://java.sun.com/docs/hotspot/HotSpotFAQ.html#benchmarking_simple – BalusC
Votre code accède au * harddisk *, et vous vous inquiétez des performances de la mise en forme des chaînes pour la génération de noms de fichier? Sérieusement? –
En fait, il va utiliser GPFS via WebDAV et/ou Amazon S3. ng pour optimiser tout ce que je peux, pendant que je construis la chose. De plus, c'est devenu un exercice académique pour moi aussi maintenant! – Martin