Долгосрочные методы из Java SDK для тестирования - PullRequest
5 голосов
/ 23 июня 2009

Я работаю над некоторыми учебными пособиями и примерами пакета java.util.concurrent. Обычно авторы примеров помещают заполнитель, помеченный комментарием как «длительное задание». Поскольку эти примеры посвящены параллельному программированию, я не заинтересован в использовании Thread.sleep (long), окруженного блоками try-catch.

Что вы используете в этих обстоятельствах?

Чтобы открыть URL-адрес, сделайте несколько сложных вычислений с плавающей точкой, ввод / вывод ... Оптимально, что эти длительные задачи не имеют побочных эффектов.

Эти методы можно рассматривать как Лорен Ипсумс на временной шкале.


Я добавлю сюда конкретные реализации:

import java.math.BigInteger;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.Random;


public class LongRunningTasks {
    public void triggerKeyGeneration(int iterations) {
        try {
            long start = System.currentTimeMillis();
            for (int i = 0; i < iterations; i++) {
                KeyPairGenerator keyGen =
                    KeyPairGenerator.getInstance("DSA", "SUN");
                SecureRandom random =
                    SecureRandom.getInstance("SHA1PRNG", "SUN");
                keyGen.initialize(1024, random);
                keyGen.generateKeyPair();
            }
            System.out.println("triggerKeyGeneration: " + (System.currentTimeMillis() - start));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
    }

    private static final int SCALE = 10000;
    private static final int ARRINIT = 2000;

    /**
     * http://www.codecodex.com/wiki/index.php?title=Digits_of_pi_calculation#Java
     * 
     * @param digits - returns good results up to 12500 digits
     * @return
     */
    public String piDigits(int digits){
        StringBuffer pi = new StringBuffer();
        int[] arr = new int[digits + 1];
        int carry = 0;

        for (int i = 0; i <= digits; ++i)
            arr[i] = ARRINIT;

        for (int i = digits; i > 0; i-= 14) {
            int sum = 0;
            for (int j = i; j > 0; --j) {
                sum = sum * j + SCALE * arr[j];
                arr[j] = sum % (j * 2 - 1);
                sum /= j * 2 - 1;
            }

            pi.append(String.format("%04d", carry + sum / SCALE));
            carry = sum % SCALE;
        }
        return pi.toString();
    }

    private static final Random rand = new Random();
    private static final BigInteger veryBig = new BigInteger(1200, rand);

    public BigInteger nextProbablePrime() {
        return veryBig.nextProbablePrime();
    }
}

Ответы [ 6 ]

7 голосов
/ 23 июня 2009
BigInteger veryBig = new BigInteger(10000, new Random());
veryBig.nextProbablePrime();
3 голосов
/ 23 июня 2009

Я когда-то использовал генератор открытого и закрытого ключа, чтобы сделать нечто подобное. Это трудоемкая задача процессора. Выполнение этого сотни или тысячи раз должно дать вам значительную задержку.

1 голос
/ 23 июня 2009

Если говорить о методах, которые в любом случае потребуют полной активности, как насчет простого цикла, выполняемого в течение определенного времени?

public void triggerKeyGeneration(int nbSec)
{
    long objectiveTime = System.currentTimeMillis() + nbSec*1000;
    while (System.currentTimeMillis() < objectiveTime);
}
1 голос
/ 23 июня 2009

Рассчитайте число Пи до очень большого числа цифр. Быстрый Google вывел эту реализацию , которая должна сделать свое дело :) 1003 *

0 голосов
/ 23 июня 2009

Вот некоторые проблемы:

0 голосов
/ 23 июня 2009

Я использую ввод / вывод (как локальный, так и не), и часто длительные задачи имеют побочный эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...