Deutsch   English   Français   Italiano  
<20241216112808.00003f74@yahoo.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Michael S <already5chosen@yahoo.com>
Newsgroups: comp.lang.c++
Subject: Re: constexpr is really very smart!
Date: Mon, 16 Dec 2024 11:28:08 +0200
Organization: A noiseless patient Spider
Lines: 79
Message-ID: <20241216112808.00003f74@yahoo.com>
References: <vjndub$2glcu$1@paganini.bofh.team>
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Injection-Date: Mon, 16 Dec 2024 10:27:13 +0100 (CET)
Injection-Info: dont-email.me; posting-host="e2e82e4ce411a49e9565e352070f744c";
	logging-data="1121749"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19j1vmHEJZI0Maiz1aLpx6P4BzBr6F2Omo="
Cancel-Lock: sha1:VFp5O2Ni2cg7IRJtqxw+rM1xCNo=
X-Newsreader: Claws Mail 3.19.1 (GTK+ 2.24.33; x86_64-w64-mingw32)
Bytes: 2906

On Sun, 15 Dec 2024 20:20:42 +0000
Student Project <student@invalid.invalid> wrote:

> The constexpr is really very smart because it can speed up algorithms 
> 1000 times according to Dave, Microsoft retired engineer. He has
> proved it by creating this video:
> 
> <https://youtu.be/8-VZoXn8f9U?si=iy1UimoWcaLG31Xi>
> 
> On my computer it took 270 microseconds to calculate fib(35) like in
> his example. It was almost instant at the blink of the eyes.
> 
> > D:\CmdLine\C_Cpp\Chrono02>program  
> > Fibonacci_c: 9227465
> > Time Taken: 270  
> > D:\CmdLine\C_Cpp\Chrono02>program  
> > Fibonacci_c: 9227465
> > Time Taken: 257  
> > D:\CmdLine\C_Cpp\Chrono02>program  
> > Fibonacci_c: 9227465
> > Time Taken: 171  
> > D:\CmdLine\C_Cpp\Chrono02>program  
> > Fibonacci_c: 9227465
> > Time Taken: 176  
> 
> Amazing.
> 

I didn't see the video (I never see that type of videos), but 270
microseconds sound astonishingly slow for fib(35).

#include <stdio.h>
#include <stdlib.h>
#include <intrin.h>

static long long fib(long n)
{
  if (fib <= 0)
    return 0;
  long long f0 = 0, f1 = 1;
  for (long i = 1; i < n; ++i) {
    long long f2 = f0 + f1;
    f0 = f1;
    f1 = f2;
  }
  return f1;
}

int main(int argz, char** argv)
{
  if (argz < 2) {
    printf("Go away!\n");
    return 1;
  }

  char* endp;
  long n = strtol(argv[1], &endp, 0);
  if (endp == argv[1]) {
    printf("%s is not a number. Go away!\n", argv[1]);
    return 1;
  }

  unsigned long long t0 = _rdtsc();
  long long f = fib(n);
  unsigned long long t1 = _rdtsc();
  printf("fib(%ld)=%lld. %lld clock cycles.\n", n, f, t1 - t0);
  return 0;
}

$ gcc -s -O2 -Wall fib.c -o fib
$ ./fib 35
fib(35)=9227465. 212 clock cycles.

212 cycles on this 11 y.o. CPU means 62 nanoseconds. Even that time, I
would guess, is mostly a measurement overhead.
$ ./fib 92
fib(92)=7540113804746346429. 281 clock cycles.