Skip to content

14. Multithreading. Ефективність використання


Мета

  • Вимірювання часу паралельних та послідовних обчислень.
  • Демонстрація ефективності паралельної обробки.

Вимоги

  1. Забезпечити вимірювання часу паралельної обробки елементів контейнера за допомогою розроблених раніше методів.

  2. Додати до алгоритмів штучну затримку виконання для кожної ітерації циклів поелементної обробки контейнерів, щоб загальний час обробки був декілька секунд.

  3. Реалізувати послідовну обробку контейнера за допомогою методів, що використовувались для паралельної обробки та забезпечити вимірювання часу їх роботи.

  4. Порівняти час паралельної і послідовної обробки та зробити висновки про ефективність розпаралелювання:

    • результати вимірювання часу звести в таблицю;
    • обчислити та продемонструвати у скільки разів паралельне виконання швидше послідовного.

Рекомендації

Приклад визначення часу обробки даних
public final class Main {

    /** Довжина масиву */
    private static final int LEN = 1_000_000;

    /** Кількість проходів */
    private static final int PASS_NUM = 3;

    /** Кількість повторів */
    private static final int REP_NUM = 100;

    /** Кількість мілісекунд в одній наносекунді */
    private static final double DIVIDER = 1_000_000;

    public static void main(final String[] args) {
        final int[] vector = new int[LEN];
        int sum = 0, i = 0, pass = 0, rep = 0;
        long start = 0;
        for (i = 0; i < LEN; i++) {
            vector[i] = i % 2 * 2 - 1;
        }
        for (pass = 0; pass < PASS_NUM; pass++) {
            sum = 0;
            start = System.nanoTime();
            for (rep = 0; rep < REP_NUM; rep++) {
                for (i = 0; i < LEN; i++) {
                    sum += vector[i];
                }
                ++sum;
            }
            System.out.printf("int array:\t%d\t%d\t%.2f ms\n", LEN, sum, (System.nanoTime() - start) / DIVIDER);
        }
    }
}