> On 17 Dec 2016, at 15:52, Sven Van Caekenberghe <s...@stfx.eu> wrote:
> 
>> 
>> On 17 Dec 2016, at 15:23, Sven Van Caekenberghe <s...@stfx.eu> wrote:
>> 
>> 
>>> On 17 Dec 2016, at 14:28, Henrik Nergaard <henrik.nerga...@uia.no> wrote:
>>> 
>>> This is not a comparable benchmark as the sum in Smalltalk keeps on growing 
>>> and ends up doing LargeInteger calculations and thus the speed loss, while 
>>> the c the int just rolls over.
>>> 
>>> Sum in Smalltalk = 500000000500000000
>>> Sum in C   = -1243309312
>> 
>> Yes, I realised afterwards. Shame on me.
>> 
>> Now, in Pharo 64 bits:
>> 
>> [ 
>>      | sum | 
>>      sum:= 0. 
>>      1 to: 1e9 do: [ :i | sum := sum + i ]. 
>>      self assert: sum = (1e9 * (1e9 + 1) / 2) ] timeToRun. 
>> 
>> "0:00:00:03.379"
>> 
>> (1e9 * (1e9 + 1) / 2) < SmallInteger maxVal.
>> 
>> "true"
>> 
>> So there the speed difference is way smaller.
> 
> And here is a correct C99 version
> 
> $ cat bench.c 
> #include <stdio.h>
> #include <time.h>
> #include <assert.h>
> 
> int main() {
>  clock_t begin = clock();
> 
>  long sum = 0;
>  for (int i = 1; i <= 1000000000; i++)
>    sum += i;
> 
>  assert(sum == ((1000000000*1000000001)/2));
> 
>  clock_t end = clock();
>  double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
>  printf("time_spent=%f\n", time_spent);
> }
> 
> prometheus:tmp sven$ ./a.out 
> time_spent=2.393986

But,

$ cat bench.c 
#include <stdio.h>
#include <time.h>
#include <assert.h>

int main() {
  clock_t begin = clock();

  long sum = 0L;
  for (long i = 1; i <= 1000000000; i++)
    sum += i;

  assert(sum == ((1000000000L*1000000001L)/2L));

  clock_t end = clock();
  double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  printf("time_spent=%f\n", time_spent);

  return (int)sum;
}

$ cc -O2 bench.c 

$ ./a.out 
time_spent=0.000002

Who knows what optimisation was applied ? Maybe the loop wasn't executed at all 
... (but I did add the return statement).

>>> Best regards,
>>> Henrik
>>> 
>>> -----Original Message-----
>>> From: Pharo-users [mailto:pharo-users-boun...@lists.pharo.org] On Behalf Of 
>>> Sven Van Caekenberghe
>>> Sent: Saturday, December 17, 2016 2:15 PM
>>> To: Any question about pharo is welcome <pharo-users@lists.pharo.org>
>>> Subject: Re: [Pharo-users] [Stupid Benchmarks] C++ vs Pharo
>>> 
>>> Like this:
>>> 
>>> [ | sum | sum:= 0. 1 to: 1e9 do: [ :i | sum := sum + i ]. sum ] timeToRun. 
>>> 
>>> "0:00:00:39.305"
>>> 
>>> cat bench.c
>>> 
>>> #include <stdio.h>
>>> #include <time.h>
>>> 
>>> int main() {
>>> clock_t begin = clock();
>>> 
>>> int sum = 0;
>>> for (int i = 0; i < 1000000000; i++)
>>>  sum += i;
>>> 
>>> clock_t end = clock();
>>> double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
>>> printf("time_spent=%f\n", time_spent); }
>>> 
>>> ./a.out
>>> 
>>> time_spent=2.370234
>>> 
>>> That is C being 16 times faster ...
>>> 
>>>> On 17 Dec 2016, at 13:49, Sven Van Caekenberghe <s...@stfx.eu> wrote:
>>>> 
>>>> Hmm, this sounds wrong (C++ should be (a lot) faster on such micro 
>>>> benchmarks).
>>>> 
>>>> You should exclude the executable startup time.
>>>> 
>>>> In Pharo you should do [ .. ] timeToRun and something similar in C/C++.
>>>> 
>>>>> On 17 Dec 2016, at 13:41, Dimitris Chloupis <kilon.al...@gmail.com> wrote:
>>>>> 
>>>>> in multiplication pharo is around 2 times slower compared to C++
>>>>> 
>>>>> #include <stdio.h>
>>>>> 
>>>>> int main()
>>>>> {
>>>>> double x=1;
>>>>> for(double i; i<1000000000 ; ++i)
>>>>> {
>>>>> x = 0.1*i;
>>>>> }
>>>>> 
>>>>> return 1;
>>>>> }
>>>>> 
>>>>> time ./testMul
>>>>>     3.13 real         3.13 user         0.00 sys
>>>>> 
>>>>> time ./pharo Ephestos.image eval "|x| x := 1. 1 to: 1000000000 do:[:each| 
>>>>> x := 0.1 * each]"
>>>>> 1
>>>>>     4.97 real         4.48 user         0.09 sys
>>>>> 
>>>>> On Sat, Dec 17, 2016 at 2:16 PM Dimitris Chloupis <kilon.al...@gmail.com> 
>>>>> wrote:
>>>>> So I was bored and decided to test how fast pharo is compared to C++. 
>>>>> 
>>>>> so I tested addition
>>>>> 
>>>>> C++ version:
>>>>> 
>>>>> #include <stdio.h>
>>>>> 
>>>>> int main()
>>>>> {
>>>>> double x=0;
>>>>> while(x<1000000000)
>>>>> {
>>>>> x = x+1;
>>>>> }
>>>>> 
>>>>> return 1;
>>>>> }
>>>>> 
>>>>> time ./test1
>>>>>     2.84 real         2.84 user         0.00 sys
>>>>> 
>>>>> Pharo version:
>>>>> 
>>>>> time ./pharo Ephestos.image eval "|x| x := 0. 1 to: 1000000000 do:[:each| 
>>>>> x := x +1]"
>>>>> 1
>>>>>     2.09 real         1.94 user         0.08 sys
>>>>> 
>>>>> Pharo is +50% faster than C++ ... o_O ... that's suprising, I assume here 
>>>>> Pharo VM probably does some kind of optimisation. 


Reply via email to