precisión de perfilado de la CPU de Java

Trato de asegurar la precisión de algunas herramientas (gratuitas) de creación de perfiles de CPU de Java, por ejemplo, sjk, visualvm.

Aquí hay un programa de muestra para hacer tareas sensibles a la CPU:

RandomStringUtils.java:

import java.util.Random;

public class RandomStringUtils {
    public String generate() {
        int leftLimit = 97; // letter 'a'
        int rightLimit = 122; // letter 'z'
        int targetStringLength = 10;
        Random random = new Random();
        StringBuilder buffer = new StringBuilder(targetStringLength);
        for (int i = 0; i < targetStringLength; i++) {
            int randomLimitedInt = leftLimit + (int)
                (random.nextFloat() * (rightLimit - leftLimit + 1));
            buffer.append((char) randomLimitedInt);
        }

        return buffer.toString();
    }
}

MainClass.java:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MainClass {

    public String crypt(String str) {
        if (str == null || str.length() == 0) {
            throw new IllegalArgumentException("String to encript cannot be null or zero length");
        }
        StringBuilder hexString = new StringBuilder();
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes());
            byte[] hash = md.digest();
            for (byte aHash : hash) {
                if ((0xff & aHash) < 0x10) {
                    hexString.append("0" + Integer.toHexString((0xFF & aHash)));
                } else {
                    hexString.append(Integer.toHexString(0xFF & aHash));
                }
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return hexString.toString();
    }

    public static void main(String[] args) {
        long N = 1000 * 100;
        if (args.length > 0) {
            N = Long.parseLong(args[0], 10);
        }
        MainClass main = new MainClass();
        RandomStringUtils randomStringUtils = new RandomStringUtils();
        for (long i = 0; i < N; i++) {
            main.crypt(randomStringUtils.generate());
        }
    }
}

Por ejemplo, uso sjk para probar la CPU:

java -jar sjk-plus-0.11.jar stcap -p 3113 -f main -i 5ms -t 30s -o dump.std
java -jar sjk-plus-0.11.jar flame -f dump.std -o report.html

ingrese la descripción de la imagen aquí

Aquí mi pregunta es, ¿por qué el tiempo de auto main()es tan grande? Y solo ejecuta el bucle. ¿No ocupa encrypt()y generate()ocupa toda la CPU?

El visualvm muestra el resultado similar.

¿Sjk considera el tiempo propio y todo el tiempo? ¿Cómo mostrarlos en el informe de línea de comando BTW?

Respuesta 1

¿Es posible usar Java para crear gráficos dinámicos que se actualicen automáticamente cuando reciba valores del exterior? Crearía una aplicación que verifique automáticamente las estadísticas de un ...

Estoy tratando de leer el archivo línea por línea con cierto retraso. Por ejemplo: leer e imprimir la primera línea del archivo, esperar 10 segundos leer e imprimir la segunda línea del archivo, etc. Hasta ahora he intentado algo ...

Tengo el siguiente código que funciona en eclipse 3.7: IEditorReference privado getReference (parte IEditorPart) {return (IEditorReference) ((PartSite) part.getSite ()). GetPane () ...

Estoy tratando de encontrar un elemento web en Chrome con la ayuda de Selenium WebDriver. Cuando el controlador inicia la URL, se muestra una lista de proyectos y el controlador tiene que seleccionar un proyecto específico ...