Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module test
- implicit none
- private
- public fib
- contains
- ! Fibonacci function
- integer recursive function fib(n) result(r)
- integer, intent(in) :: n
- if (n < 2) then
- r = n
- else
- r = fib(n-1) + fib(n-2)
- end if
- end function ! end of Fibonacci function
- end module
- program fibonacci
- use test, only: fib
- implicit none
- integer :: r,i
- integer :: n = 1e09
- real(8) :: start, finish, cum_time
- cum_time=0
- do i= 1,n
- call cpu_time(start)
- r = fib(20)
- call cpu_time(finish)
- cum_time = cum_time + (finish - start)
- if (cum_time >0.5) exit
- enddo
- print*,i,'runs, average elapsed time is', cum_time/i/1e-06, 'us'
- end program
- gfortran -O3 -march=native
- #include <iostream>
- #include <chrono>
- using namespace std;
- // Fib function
- int fib(const int n)
- {
- int r;
- if (n < 2)
- r = n;
- else
- r = fib(n-1) + fib(n-2);
- return r;
- } // end of fib
- template<typename T, typename ... Args>
- double timeit(T (*func)(Args...), Args...args)
- {
- double counter = 1.0;
- double mean_time = 0.0;
- for (auto iter=0; iter<1e09; ++iter){
- std::chrono::time_point<std::chrono::system_clock> start, end;
- start = std::chrono::system_clock::now();
- func(args...);
- end = std::chrono::system_clock::now();
- std::chrono::duration<double> elapsed_seconds = end-start;
- mean_time += elapsed_seconds.count();
- counter++;
- if (mean_time > 0.5){
- mean_time /= counter;
- std::cout << static_cast<long int>(counter)
- << " runs, average elapsed time is "
- << mean_time/1.0e-06 << " xC2xB5s" << std::endl;
- break;
- }
- }
- return mean_time;
- }
- int main(){
- timeit(fib,20);
- return 0;
- }
- g++ -O3 -march=native
- Fortran: 24991 runs, average elapsed time is 20.087 us
- C++ : 12355 runs, average elapsed time is 40.471 µs
- .L28:
- cmpl $1, %r13d
- jle .L29
- leal -8(%rbx), %eax
- movl %ecx, 12(%rsp)
- movl %eax, 48(%rsp)
- leaq 48(%rsp), %rdi
- leal -9(%rbx), %eax
- movl %eax, 16(%rsp)
- call __bench_MOD_fib
- leaq 16(%rsp), %rdi
- movl %eax, %r13d
- call __bench_MOD_fib
- movl 12(%rsp), %ecx
- addl %eax, %r13d
- .L28:
- movl 72(%rsp), %edx
- cmpl $1, %edx
- movl %edx, %eax
- jle .L33
- subl $3, %eax
- movl $0, 52(%rsp)
- movl %eax, %esi
- movl %eax, 96(%rsp)
- movl 92(%rsp), %eax
- shrl %eax
- movl %eax, 128(%rsp)
- addl %eax, %eax
- subl %eax, %esi
- movl %edx, %eax
- subl $1, %eax
- movl %esi, 124(%rsp)
- movl %eax, 76(%rsp)
- // Fib function
- int fib(const int n)
- {
- int r;
- if (n < 2)
- r = n;
- else
- r = fib(n-1) + fib(n-2);
- asm("");
- return r;
- } // end of fib
- .L7:
- cmpl $1, %edx
- jle .L17
- leal -4(%rbx), %r13d
- leal -5(%rbx), %edx
- cmpl $1, %r13d
- jle .L19
- leal -5(%rbx), %r14d
- cmpl $1, %r14d
- jle .L55
- leal -6(%rbx), %r13d
- movl %r13d, %edi
- call _Z3fibi
- leal -7(%rbx), %edi
- movl %eax, %r15d
- call _Z3fibi
- movl %r13d, %edi
- addl %eax, %r15d
- Fortran: 24991 runs, average elapsed time is 20.087 us
- C++ : 25757 runs, average elapsed time is 19.412 µs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement