Возможно ли усовершенствование следующего кода на Фортране? - PullRequest
0 голосов
/ 06 мая 2018

Вот одна из готовых программ, использующих этот конкретный алгоритм.

        program Lotto

        implicit none

        INTEGER::MAXTHREADS
        INTEGER::I,N,Q,RAN,RAN4(4),N129(9),LOTTO5(5)
        REAL::R,TI,TIMELY,SEC

        CALL RANDOM_SEED()
!____________________________________________________________________________
!____________________________________________________________________________

        N=0
        RAN4=0
        DO
            CALL RANDOM_NUMBER(R)
            RAN=1+INT(9*R)
            IF(COUNT(RAN==RAN4(1:4))/=0)CYCLE
            N=N+1
            RAN4(N)=RAN
            IF(N==4)EXIT
        ENDDO

        N129=[1,2,3,4,5,6,7,8,9]
        N129(RAN4(1:4))=0

        N=0
        DO I=1,9
            IF(N129(I)==0)CYCLE
            N=N+1
            LOTTO5(N)=I
        ENDDO    
        PRINT*,LOTTO5

        end program Lotto

В ответ на мой оригинальный пост High Performance Mark сделал два важных замечания:

  1. Мало что можно сказать о фрагменте кода, не видя контекст, в котором он используется; и

  2. Вероятно, не стоит тратить время на что-то незначительное. (Извиняюсь за перефразирование.)

Вышеприведенная короткая программа «Лото» предназначена только в качестве вспомогательной демонстрации, чтобы показать - в контексте - как можно использовать алгоритм фильтрации. Конечно, как набор из нескольких строк кода, он не может быть улучшен. Однако я надеялся на обратное. При работе с 1500-2000 строками нового кода на Фортране каждый день, и подобные фрагменты кода появляются в одной и той же программе 10 или 12 раз, если вы можете улучшить (оптимизировать) одну из них, вы можете оптимизировать их все как минимум для некоторого сокращения времени выполнения , что косвенно говорит о втором наблюдении HPM. Как программист на Фортране, у меня есть только одна цель - получить желаемые результаты в кратчайшие сроки. Это хороший способ сказать это. Более реалистичное утверждение звучит так: «Чтобы добиться желаемых результатов, потратив при этом наименьшую сумму денег». Поскольку «оптимизация» является одним из многих тегов, которые использует переполнение стека, я надеялся, что некоторые обсуждения, связанные с оптимизацией, могут быть продолжены, но, по-видимому, Это не относится к делу. Какой-то другой форум, я полагаю. Некоторым юным пользователям может быть интересно узнать, как работает оптимизация кода, но многие из них, по-видимому, в значительной степени озабочены тем, что они в самое ближайшее время не могут правильно выполнить определенные коллекции кода.

Критика HPM всегда заметна, когда он просматривает сообщение, поэтому вот мои последние два извинения перед ним:

  1. Вы правы по поводу удаления заявлений. В «подготовительном» разделе программы было 15 действующих операторов Фортрана, 3 строки комментариев и 2 директивы OMP. Из этих 20 я должен был пропустить 14 из них, включая 3 строки комментариев и 2 OMP-директивы, для ясности. Я теперь удалил их. Тем не менее, моя Microsoft Visual Studio настроена на выполнение всех программ с использованием OMP, а также выполняет «Лото» в том виде, в каком оно есть, с указанием количества потоков и другой информации о потоках. Лото прекрасно работает в OMP, но для демонстрационных целей мне, конечно, не понадобился весь этот «салат».

  2. Прошу прощения за строки с несколькими утверждениями. Я не использую это в моем обычном программировании. Это произошло потому, что я считал, что Stock Overflow хочет, чтобы программы, которые они печатают, были как можно более краткими и лаконичными. Был ли я неправ в этом? Я снял мультилининг.

1 Ответ

0 голосов
/ 13 мая 2018

ОК, я взял наживку ...

Если я правильно понимаю код (а если нет, то вы можете игнорировать весь этот ответ), он выбирает (в примере) случайные 5 элементов (без элементов дважды) из массива [1,2,3,4,5,6,7,8,9].

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

  FUNCTION random_perm(n) RESULT(perm)
    ! return a random permutation of the integers 1..n, uses Knuth's shuffle
    INTEGER, INTENT(in) :: n
    INTEGER, DIMENSION(n) :: perm
    INTEGER, DIMENSION(n) :: randi
    REAL, DIMENSION(n) :: randr
    INTEGER :: tmp, ix, jx

    CALL random_SEED()
    CALL random_NUMBER(randr)
    randi = 1+INT(n*randr)
    perm = [(ix,ix=1,n)]

    DO ix = 1, n-1
       jx = randi(ix)
       tmp = perm(ix)
       perm(ix) = perm(jx)
       perm(jx) = tmp
    END DO  

  END FUNCTION random_perm

ОП может использовать такую ​​функцию:

n129 = random_perm(9)
lotto5 = n129(1:5)

На данный момент lotto5 не отсортировано. Если это важно, один из способов «сортировки» результата будет состоять в том, чтобы заменить предыдущие две строки на

 n129 = random_perm(9)
 ix = 1
 DO jx = 1, 9
       IF (ANY(n129(1:5)==jx)) THEN
          lotto5(ix) = jx
          ix = ix+1
       END IF
 END DO

Из ограниченного количества испытаний:

  • Я достаточно уверен, что это работает правильно.
  • Это медленнее, чем код OP, примерно на 2-4%.

Если OP беспокоит только скорость, то OP может позаботиться о том, чтобы «включить» функцию вручную, чтобы увидеть, имеет ли она какое-то значение. Я этого не делал и не буду. Я думаю, что полезно иметь генератор случайных перестановок в отдельной функции. OP намекает на то, что эта функция (или, скорее, представление OP в опубликованном коде) является частью гораздо большего кода, поэтому полезна ли предоставленная мной функция в этом контексте, я не знаю.

Наконец, чтобы ответить на более широкий вопрос OP, что я написал лучше оригинала?

Нет, медленнее.

Возможно, да. Если целью OP является получение первых m элементов случайной перестановки целых чисел 1,2,...,n, то функция для возврата случайной перестановки является полезным компонентом для более крупных программ. Но OP может обоснованно утверждать, что его (?) Код является лучшей (потому что более быстрой) реализацией этой функции, но просто по-другому.

Что возвращает нас к началу, что означает лучше ?

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