Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2024, 15:17   #11
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 200
По умолчанию

>Дополнительно, для Java хотелось бы узнать полное время, включающее запуск JVM и компиляцию, а также настройки JVM, отвечающие за оную (CompileThreshold в первую очередь).

я тестировал только работу цикла по расчёту простых чисел. Запуск JVM можно узнать через программу time, то есть командой
time java primes
DeepFlake вне форума Ответить с цитированием
Старый 12.08.2024, 15:18   #12
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 200
По умолчанию

>Даже ваш код можно ускорить, если проверять делители только до квадратного корня числа.

дак я наоборот выбрал максимально неоптимальный алгоритм, чтобы подольше считал
DeepFlake вне форума Ответить с цитированием
Старый 12.08.2024, 18:57   #13
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,371
По умолчанию

DeepFlake
Цитата:
дак я наоборот выбрал максимально неоптимальный алгоритм, чтобы подольше считал
Не неоптимальный, а неверный. С подобной реализацией алгоритма приходится ещё и бороться со студентами.

Если получен правильный ответ, то это ещё не значит, что он получен правильным алгоритмом. Ещё в школе, при решении задачи с известным ответом, играли с данными задачи.

Для того, что бы подольше считал нужны другие задачи.
Например, задача: Есть два массива целых чисел. Все числа массива случайные и не повторяются.
Проверить, является ли один массив подмножеством второго.
Тут есть три решения.
Наивное - с вложенным циклом. Перебор элементов одного массива (меньшего по длине) и поиск соответствующего элемента во втором.
Если размер большего по длине массива за десяток тысяч элементов, а меньшего на порядок меньше, то считать будет долго.

Да, есть и другие решения задачи, но ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.08.2024, 19:10   #14
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 200
По умолчанию

>Не неоптимальный, а неверный

не-е, всё правильно работает.

А насчёт массивов - наверное сначала отсортировать надо их.
Но в этой задаче нет арифметических или математических операций, ни интенсивной работы с динамческой памятью, она для тестирования производительности не интересна.
DeepFlake вне форума Ответить с цитированием
Старый 12.08.2024, 22:02   #15
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,371
По умолчанию

DeepFlake
Цитата:
А насчёт массивов - наверное сначала отсортировать надо их.
Это второе решение. Но вам оно не нужно, вам ведь нужно, что бы подольше считал.

Цитата:
ни интенсивной работы с динамческой памятью
Так оформляйте массив динамическим списком и ...

Математические операции - это сопроцессор. Тут что с чем сравнивать? Он у вас на компе один.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 13.08.2024, 14:03   #16
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 200
По умолчанию

Вот прототип программы для тестирования производительности работы с массивами на задаче, которую предложил ViktorR.
Задача такая: даны два множества, элементами множеств являются случайные целые числа, в каждом множестве элементы не повторяются. Множества представлены в машине в виде массива. Требуется определить является ли какое-либо множество (из этих двух) подмножеством другого.

В реальной программе данные будут загружаться из файлов.

Код:
{ License: Public domain. }

program TestSubset;

uses sysutils;

var
    start_tm, stop_tm : TDateTime;
    start_ms, stop_ms : comp;
    dur : double;

    set1, set2 : array of longint;
    set1_len, set2_len : longint;
    found, isSubSet: boolean;
    el_1, el_2: longint;

begin
    set1_len := 5;
    set2_len := 2;
        // задали длину массивов

    setlength( set1, set1_len);
    setlength( set2, set2_len);
        // выделили память под массивы

    set1[0]:= -5; set1[1]:= 1002; set1[2]:= 7; set1[3]:= 2; 
    set1[4]:= -96;
    set2[0]:= 7; set2[1]:= -96; 
        // заполнили массивы тестовыми данными

    start_tm := Now;

    isSubSet := true;
    if set1_len >= set2_len
    then // первый массив больше
        begin
        for el_1 in set2
        do  // проход по второму массиву
            begin
            found := false;
            for el_2 in set1
            do  // проход по первому массиву
                begin
                if el_2 = el_1
                then // нашли совпадение элементов
                    begin 
                    found := true;
                    writeln( 'matches ', el_1 );
                    break;
                    end
                end;
            writeln( 'found=', found );
            if not found
            then // не все элементы set2 принадлежат set1
                begin
                isSubSet := false;
                    // не является подмножеством
                break;
                end
            end;
        end
    else // второй массив больше
        begin
        writeln( 'второй больше' );
        for el_1 in set1
        do // проход по первому массиву
            begin
            found := false;
            for el_2 in set2
            do // проход по второму массиву
                begin
                if el_2 = el_1
                then // нашли совпадение элементов
                    begin 
                    found := true;
                    writeln( 'matches ', el_1 );
                    break;
                    end
                end;
            writeln( 'found=', found );
            if not found
            then // не все элементы set1 принадлежат set2
                begin
                isSubSet := false;
                    // не является подмножеством
                break;
                end
            end;
        end;

    stop_tm := Now;
    start_ms := TimeStampToMSecs( DateTimeToTimeStamp( start_tm ) );
    stop_ms := TimeStampToMSecs( DateTimeToTimeStamp( stop_tm ) );
    dur := double( stop_ms - start_ms ) * 1.0e-3;

    writeln( 'is subset =', isSubSet );
    if set1_len >= set2_len
    then
        if isSubSet
        then
            writeln( 'Второе множество является подмножеством первого.' )
        else
            writeln( 'Второе множество не является подмножеством первого.' )
    else
        if isSubSet
        then
            writeln( 'Первое множество является подмножеством второго.' )
        else
            writeln( 'Первое множество не является подмножеством второго.' );

    writeln( 'Продолжительность расчёта: ', dur:10:3, ' секунд.' );

end.
DeepFlake вне форума Ответить с цитированием
Старый 13.08.2024, 22:55   #17
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,371
По умолчанию

Подготовить массивы можно так:
1. Формируем длинный массив из последовательно наращиваемых значений - арифметическая последовательность. Задаём размер массива, первый элемент, шаг.
2. Перемешиваем элементы массива случайным образом. Есть ли в вашем Паскале такая возможность? Если нет, то можно найти подходящий алгоритм в Сети.
Тут, например: https://space-base.ru/library/algori...a-massiva-edit
3. Последовательно или с шагом выбираем элементы из первого массива для второго.
4. Перемешиваем элементы случайным образом.

Поиск лучше оформить в виде функции, в которую, в виде параметров, передаются массивы в определённой последовательности. В этом случае код решения пишется один раз.

Если оформить функцией, то вложенный цикл может быть иным.
а) во вложенном цикле нашли подходящий элемент - break
б) если сравнение выполняется для последнего элемента и нет совпадения, то return False: работа функции завершается
в) После завершения внешнего цикла можно вернуть True: т.е. пишем код без использования флажков.

PS:
1. Задача взята отсюда: https://www.geeksforgeeks.org/find-w...r-array-set-1/

2. Создавать достаточно большой массив, хотя бы на 10 000 элементов, возможно будет сложно: какой Паскаль тут?.
Другой путь - динамический массив, но есть ли готовая библиотека? Иначе код подрастёт ...

3. Описанный выше алгоритм предполагает, что второй массив подмножество первого. С точки зрения "подольше считал" это то самое. Но для тестов можно один элемент второго массива "поломать". Например, после изготовления второго массива последний элемент сделать заведомо большим всех элементов первого массива.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 14.08.2024, 21:16   #18
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 200
По умолчанию

to ViktorR:
Да, очень интересно, спасибо, учту.

>Создавать достаточно большой массив, хотя бы на 10 000 элементов, возможно будет сложно: какой Паскаль тут?. Другой путь - динамический массив, но есть ли готовая библиотека? Иначе код подрастёт ...

Я использую Free Pascal. Какая библиотека?

>Поиск лучше оформить в виде функции, в которую, в виде параметров, передаются массивы в определённой последовательности. В этом случае код решения пишется один раз.

А я специально не хочу использовать никакие функции. У меня задача - написать эквивалентные программы на разных языках. А если использовать вспомогательную функцию, то неизвестно как это отразится на машинном коде. Дело в том, что в разных языках массивы передаются, вообще говоря, по-разному. Вдруг в каком-нибудь языке для параметров-массивов используется дополнительное разыменование, и этот язык проиграет в тестировании на скорость.
DeepFlake вне форума Ответить с цитированием
Старый 14.08.2024, 21:36   #19
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
У меня задача - написать эквивалентные программы на разных языках.
И т.к. вы используете GCC, LLVM, то получите один и тот же машинный код. Смысл ваших замеров?

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
Вдруг в каком-нибудь языке для параметров-массивов используется дополнительное разыменование, и этот язык проиграет в тестировании на скорость.
Так это ж интересный вариант. Разные сборщики мусора с разными параметрами, анбоксинг и т.д. - т.е. реальные программы.
p51x вне форума Ответить с цитированием
Старый 14.08.2024, 22:06   #20
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 200
По умолчанию

>И т.к. вы используете GCC, LLVM, то получите один и тот же машинный код. Смысл ваших замеров?

6 языков: С++, Java, Free pascal, Go, Ada, Rust.

Free Pascal, Go и Java не используют GCC и LLVM.
GNU C++ сразу генерирует машинный код без промежуточного представления. хотя LTO использует (оптимизатор)

>Так это ж интересный вариант. Разные сборщики мусора с разными параметрами, анбоксинг и т.д. - т.е. реальные программы.

предложите алгоритм.
сейчас я пытаюсь проверить на скорость только доступ к элементам массива.
DeepFlake вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли доказать, что бывают скорости больше скорости света challengerr Свободное общение 96 09.08.2015 08:08
Вопрос о скорости PDO ? Haroutweb PHP 1 25.08.2012 12:35
оптимизация по скорости sin Medved.tolik Помощь студентам 0 14.12.2011 23:43
График скорости как в DM dmitriegorovih Общие вопросы Delphi 5 30.01.2011 08:22
Сравнение скорости компиляторов Umen Обсуждение статей 13 05.10.2009 19:48