# 79 Languages speed competition: Can we make Fortran win?

**URL:** <https://fortran-lang.discourse.group/t/79-languages-speed-competition-can-we-make-fortran-win/3038>\
**Category:** Uncategorized\
**Created:** [March 24, 2022, 7:40am UTC](https://fortran-lang.discourse.group/t/79-languages-speed-competition-can-we-make-fortran-win/3038 "2022-03-24T07:40:01Z")\
**Posts on this page:** 1\
**Showing post:** 17

<div class="post-metadata">

**Author:** ![Jweber](https://avatars.discourse-cdn.com/v4/letter/j/e95f7d/32.png) [@Jweber](https://fortran-lang.discourse.group/u/Jweber)\
**Post date:** [March 27, 2022, 8:58pm UTC](https://fortran-lang.discourse.group/t/79-languages-speed-competition-can-we-make-fortran-win/3038/17 "2022-03-27T20:58:42Z")

</div>

Here my results for the 4 diffent Fortran codes of the comparison project

The original, non tweaked algorithm has been presented (for Python, C# and C++) in [https://www.youtube.com/watch?v=yYcHWGxtRQo&list=PLF2KJ6Gy3cZ5Er-1eF9fN1Hgw\_xkoD9V1&index=8](https://www.youtube.com/watch?v=yYcHWGxtRQo&list=PLF2KJ6Gy3cZ5Er-1eF9fN1Hgw_xkoD9V1&index=8)

The rules are explained in [Primes/CONTRIBUTING.md at drag-race · PlummersSoftwareLLC/Primes · GitHub](https://github.com/PlummersSoftwareLLC/Primes/blob/drag-race/CONTRIBUTING.md)

My non-faithful (it does not use classes) approach has been presented in the Fortran vs. Cobol comparison video, although there exists also faithful implementation by Thomas Jollans (github user tjol).  
I do not know, I guess because it has a rather “classic” Fortran look.

The considered compilers are:  
gfortran-7  
gfortran-8  
gfortran-9  
gfortran-10  
gfortran-11  
ifort 21.04  
ifx 21.04 beta  
aocc 3.1.0 based on flang 12.0

The test have been performed on an AMD Ryzen 7 3700X CPU (base frequency 2200 Mhz,  
max frequency 3600 MHz)

The numbers are the number of times the sieve algorithm is completed  
for the range up to 1000000 with 5 seconds

Notable results are:

- When a bitfiled is used, there are strong variations between different compilers  
(and different versions of gfortran). The variations increase for the object-oriented version

- The fastest code is generated if one 1-bit integer is used to store the state (prime/not prime)  
of a number (gain ~50% over the best bitfield results). There the results are more consistent than for the bitfield

- Storing the states of the numbers in an array of logical variables is slower than storing it in an 8bit integer and similar to the performance of a good bitfield implementation.

- Disclaimer: I do not believe that I really chose the optimal command line options

# solution\_1 One bit per digit (stored in int64 variables), not object oriented, shown in video

gfortran-7 -march=native -O3 -o benchmark-gcc-7 PrimesFortran.f08  
8905.2

gfortran-8 -march=native -O3 -o benchmark-gcc-8 PrimesFortran.f08  
11210

gfortran-9 -march=native -O3 -o benchmark-gcc-9 PrimesFortran.f08  
11211

gfortran-10 -march=native -O3 -o benchmark-gcc-10 PrimesFortran.f08  
11323

gfortran-11 -march=native -O3 -o benchmark-gcc-11 PrimesFortran.f08  
12417

Note: ifort -v results in ifort version 2021.4.0 ifort dors not recognize the .f08 suffix changed to .f90  
ifort -Ofast -march=core-avx2 -o benchmark-ifort-21.04 PrimesFortran.f90  
6097

ifx -Ofast -march=core-avx2 -o benchmark-ifx-21.04-beta PrimesFortran.f9  
7283

flang -march=native -O3 -o benchmark-flang-12.0 PrimesFortran.f90  
6659

# Object-oriented with bit array, fully meets the ‘faithful’ criteria of the comparison

gfortran-7 -march=native -O3 -oo-bitarray-gcc-7 prime-bitarray.f90  
12552

gfortran-8 -march=native -O3 -oo-bitarray-gcc-8 prime-bitarray.f90  
8199

gfortran-9 -march=native -O3 -oo-bitarray-gcc-9 prime-bitarray.f90  
8138

gfortran-10 -march=native -O3 -oo-bitarray-gcc-10 prime-bitarray.f90  
7613

gfortran-11 -march=native -O3 -oo-bitarray-gcc-11 prime-bitarray.f90  
12619

ifort -march=core-avx2 -O3 -oo-bitarray-ifort-12.04 prime-bitarray.f90  
2591.0

ifx -march=core-avx2 -O3 -oo-bitarray-ifx-12.04 prime-bitarray.f90  
2547

flang -march=native -O3 -oo-bitarray-flang-12.0 prime-bitarray.f90  
1412

# Object-oriented, one 8-bit Integer per number

gfortran-7 -march=native -O3 -oo-8bit-gcc-7 prime-8bit.f90  
18155

gfortran-8 -march=native -O3 -oo-8bit-gcc-8 prime-8bit.f90  
16597

gfortran-9 -march=native -O3 -oo-8bit-gcc-9 prime-8bit.f90  
17870

gfortran-10 -march=native -O3 -oo-8bit-gcc-10 prime-8bit.f90  
18029

gfortran-11 -march=native -O3 -oo-8bit-gcc-11 prime-8bit.f90  
18247

ifort -march=core-avx2 -O3 -oo-8bit-ifort-12.4 prime-8bit.f90  
18086

ifx -march=core-avx2 -O3 -oo-8bit-ifort-12.4 prime-8bit.f90  
18361

flang -march=native -O3 -oo-8bit-flang-12.0 prime-8bit.f90  
9651  
(Note: The values varied strongly between approx- 4000 and approx. 11000)

# Object-oriented, one Logical per number

gfortran-7 -march=native -O3 -oo-logical-gcc-7 prime-logical-array.f90  
12833

gfortran-8 -march=native -O3 -oo-logical-gcc-8 prime-logical-array.f90  
12764

gfortran-9 -march=native -O3 -oo-logical-gcc-9 prime-logical-array.f90  
12441

gfortran-10 -march=native -O3 -oo-logical-gcc-10 prime-logical-array.f90  
12453

gfortran-11 -march=native -O3 -oo-logical-gcc-11 prime-logical-array.f90  
12635.8

ifort -march=core-avx2 -O3 -oo-logical-ifort-12.4 prime-logical-array.f90  
13174

ifx -march=core-avx2 -O3 -oo-logical-ifort-12.4 prime-logical-array.f90  
13385

flang -march=native -O3 -oo-logical-flang-12.0 prime-logical-array.f90  
5573  
(Note: strong fluctuations of the results between ~3800 and ~8300)

---

_[View the full topic](https://fortran-lang.discourse.group/t/79-languages-speed-competition-can-we-make-fortran-win/3038)._
