Recent

Author Topic: Energy Efficiency and Pascal  (Read 2417 times)

tudi_x

  • Hero Member
  • *****
  • Posts: 532
Energy Efficiency and Pascal
« on: September 16, 2017, 11:24:05 am »
hi All,
i found interesting people started to look into the energy spent for computing therefore i am sharing the link for Energy Efficiency across Programming Languages:
https://sites.google.com/view/energy-efficiency-languages/
Lazarus 2.0.2 64b on Debian LXDE 10

jwdietrich

  • Hero Member
  • *****
  • Posts: 1232
    • formatio reticularis
Re: Energy Efficiency and Pascal
« Reply #1 on: September 16, 2017, 03:16:26 pm »
Thanks for sharing. This is a very interesting paper.
function GetRandomNumber: integer; // xkcd.com
begin
  GetRandomNumber := 4; // chosen by fair dice roll. Guaranteed to be random.
end;

http://www.formatio-reticularis.de

Lazarus 2.2.6 | FPC 3.2.2 | PPC, Intel, ARM | macOS, Windows, Linux

Thaddy

  • Hero Member
  • *****
  • Posts: 14205
  • Probably until I exterminate Putin.
Re: Energy Efficiency and Pascal
« Reply #2 on: September 16, 2017, 03:25:19 pm »
Comparing apples and pears.
The code should have been compiled with
Code: [Select]
fpc -CX -XXs -O4 binarytrees.pas and the code should have looked like:
Code: Pascal  [Select][+][-]
  1. (*
  2.   The Computer Language Benchmarks Game
  3.   http://benchmarksgame.alioth.debian.org/
  4.  
  5.   contributed by Vitaly Trifonof based on a contribution of Ales Katona
  6.   *reset*
  7. *)
  8.  
  9. program BinaryTrees;
  10. {$I-}  // to compare like for like
  11. type
  12.   PNode = ^TNode;
  13.   TNode = packed record  //essential
  14.     l, r: PNode;
  15.   end;
  16.  
  17. function CreateNode(l2, r2: PNode): PNode; inline;
  18. begin
  19.   CreateNode := GetMem(SizeOf(TNode));
  20.   CreateNode^.l:=l2;
  21.   CreateNode^.r:=r2;
  22. end;
  23.  
  24.  
  25. (* Destroy node and it subnodes in one procedure *)
  26.  
  27. procedure DestroyNode(ANode: PNode); inline;
  28. var
  29.   LNode, RNode: PNode;
  30. begin
  31.   LNode := ANode^.l;
  32.   if LNode <> nil then
  33.   begin
  34.     RNode := ANode^.r;
  35.     if LNode^.l <> nil then
  36.     begin
  37.       DestroyNode(LNode^.l);
  38.       DestroyNode(LNode^.r);
  39.       FreeMem(LNode, SizeOf(TNode));
  40.  
  41.       DestroyNode(RNode^.l);
  42.       DestroyNode(RNode^.r);
  43.       FreeMem(RNode, SizeOf(TNode));
  44.     end
  45.     else
  46.     begin
  47.       DestroyNode(LNode);
  48.       DestroyNode(RNode);
  49.     end
  50.   end;
  51.  
  52.   FreeMem(ANode, SizeOf(TNode));
  53. end;
  54.  
  55.  
  56. (* Left subnodes check in cycle, right recursive *)
  57.  
  58. function CheckNode(ANode: PNode): Longint; inline;
  59. begin
  60.   CheckNode := 0;
  61.   while ANode^.l <> nil do
  62.   begin
  63.     CheckNode += 1 + CheckNode(ANode^.r);
  64.     ANode := ANode^.l
  65.   end;
  66.   CheckNode += 1;
  67. end;
  68.  
  69.  
  70. (*
  71.    Create node and it subnodes in one function
  72.  
  73.    make(1,a)=(2I-1)=Ia make(2,Ia-1)=(2(2I-1)-1)=(4I-3)
  74.                        make(2,Ia)  =(2(2I-1))  =(4I-2)
  75.  
  76.    make(1,b)=(2I)=Ib   make(2,Ib-1)=(2(2I)-1)  =(4I-1)
  77.                        make(2,Ib)  =(2(2I))    =(4I)
  78. *)
  79.  
  80. function Make(d: Longint): PNode;
  81. begin
  82.   case d of
  83.    0: Make:=CreateNode(nil, nil);
  84.    1: Make:=CreateNode(CreateNode(nil, nil), CreateNode(nil, nil));
  85.   else
  86.       d -= 2;
  87.       Make:=CreateNode(
  88.                            CreateNode( Make(d),Make(d) ),
  89.                            CreateNode( Make(d),Make(d) )
  90.                         )
  91.   end
  92. end;
  93.  
  94. const
  95.   mind = 4;
  96.  
  97. var
  98.   maxd : Longint = 10;
  99.   strd,
  100.   iter,
  101.   c, d, i : Longint;
  102.   tree, llt : PNode;
  103.  
  104. begin
  105.   if ParamCount = 1 then
  106.     Val(ParamStr(1), maxd);
  107.  
  108.   if maxd < mind+2 then
  109.      maxd := mind + 2;
  110.  
  111.   strd:=maxd + 1;
  112.   tree:=Make(strd);
  113.   Writeln('stretch tree of depth ', strd, #9' check: ', CheckNode(tree));
  114.   DestroyNode(tree);
  115.  
  116.   llt:=Make(maxd);
  117.  
  118.   d:=mind;
  119.   while d <= maxd do begin
  120.     iter:=1 shl (maxd - d + mind);
  121.     c:=0;
  122.     for i:=1 to Iter do begin
  123.       tree:=Make(d);
  124.       c:=c + CheckNode(tree);
  125.       DestroyNode(tree);
  126.     end;
  127.     Writeln(Iter, #9' trees of depth ', d, #9' check: ', c);
  128.     Inc(d, 2);
  129.   end;
  130.  
  131.   Writeln('long lived tree of depth ', maxd, #9' check: ', CheckNode(llt));
  132.   DestroyNode(llt);
  133. end.

Factor 5! (on ARMHF, after selecting proper processor too.) Freepascal is notoriously conservative.
All examples can be optimised in the same way. This is just the first one.
« Last Edit: September 16, 2017, 03:40:43 pm by Thaddy »
Specialize a type, not a var.

 

TinyPortal © 2005-2018