Perl och effektiv kod

Här pratar vi programmering i dessa olika former. Perl, C/C++, Pascal, ADA, Lisp, COBOL, ZX Basic och mm.
Post Reply
Hasseman
Posts: 964
Joined: 17 May 2003, 22:56
Location: Alingsås
Contact:

Perl och effektiv kod

Post by Hasseman » 9 April 2005, 20:55

Är det sanning eller myt att ju färre tecken en beräkning består av desto effektivare är koden?

beräkning1:

Code: Select all

$result = $var == 0 ? 14 : 7;
21 tecken

beräkning2

Code: Select all

if ($var == 0) {
$result = 14;
} else {
$result = 7;
}
41tecken

Är beräkning2 i runda slängar dubbelt så effektiv än beräkning1?

Finns det några generella knep för hur man skall effektivisera sin kod
t.ex. få tecken?

Kan man på något sätt mäta och jämföra två olika beräkningar eller program och på något sätt beräkna i lämplig enhet hur mycket snabbare kod1 är en kod2?
Share the penguin and If you do, lucky end for them and you.

//hasseman

User avatar
andersRson
Posts: 428
Joined: 8 January 2003, 01:23
Location: Lund, Skåneland
Contact:

Post by andersRson » 9 April 2005, 21:07

Om du har en vettig kompilator/tolk så spelar det ingen roll hur många tecken du har i din källkod, det kommer ändå översättas till samma binärkod/bytekod/whatever. Till exempel just x ? y:z som bara byts ut till just en sådan if-sats som du skrev(åtminstone i C).
Man optimerar inte kod genom att sitta och räkna tecken, det är effektiva algoritmer som behövs och det är inte samma sak som kort kod.
Det finns 10 typer av människor i världen: de som kan läsa binärt och de som inte kan det.

Hasseman
Posts: 964
Joined: 17 May 2003, 22:56
Location: Alingsås
Contact:

Post by Hasseman » 9 April 2005, 21:41

Ok intrerssant.....

Men en sak skiljer dock C ifrån Perl.

C kompilerar du koden till källkod. Sedan exekeverar programmet.
I Perl så exekverar du program.pl varpå koden översätts till maskinkod samtidigt som det exekveras eller strax före.

Är det i detta fallet viktigare att koden inehåller färre tecken eftersom det blir färre tecken att läsa in innan programmet översätts? Eller blir själva översättningen mer komplicerad med färre tecken eftersom pga att översättningen till maskinkod blir mer komplicerad.

Hur som helst så skulle det vara roligt om någon hade någon metod där man kunde avgöra hur krävande ett program är.
Share the penguin and If you do, lucky end for them and you.

//hasseman

Lucifer888
Posts: 4111
Joined: 3 February 2003, 12:18
Location: Stockholm

Post by Lucifer888 » 9 April 2005, 21:47

Finns sätt att kolla exekveringstid på komandon.

Låt oss säga att jag vill testa hastigheten mellan komandona:
"ls" och "for i in `ls`; do echo $i;done":

Code: Select all

time for i in `ls`; do echo $i;done

time ls
Då får du en ungefärlig jämförelse iaf
NAME
time - time a simple command or give resource usage
"It's not that I hate people, I just think they're all idiots"
"Långt hår kräver mycket näring, framhålls det, och berövar hjärnan energi."

Hasseman
Posts: 964
Joined: 17 May 2003, 22:56
Location: Alingsås
Contact:

Post by Hasseman » 9 April 2005, 22:50

ok bra.....då får man ju en enhet för hur lång tid det tar att exekvera ett kommando.
Men om man t.ex skall jämföra hur två olika relativt simpla beräkningar som skall utgöra delar av ett program är i förhållande till varandra så är det nog säkrast att loopa dessa sisådär 100ggr så att inte tiden skall avrundas till 0..... heheheh
Share the penguin and If you do, lucky end for them and you.

//hasseman

User avatar
andersRson
Posts: 428
Joined: 8 January 2003, 01:23
Location: Lund, Skåneland
Contact:

Post by andersRson » 11 April 2005, 13:18

Hasseman wrote:Är det i detta fallet viktigare att koden inehåller färre tecken eftersom det blir färre tecken att läsa in innan programmet översätts? Eller blir själva översättningen mer komplicerad med färre tecken eftersom pga att översättningen till maskinkod blir mer komplicerad.

Man kommer antagligen inte märka någon skillnad, om det inte är så att man skriver ett par miljoner rader kod. Men det är knappast troligt att man skriver ett par miljoner rader kod i Perl. :)
Illustrativt exempel där mer källkod ger avsevärt mycket bättre prestanda:

Code: Select all

/* Vanlig linjär sökning */
find(int[] sortedArray, int target) {
    for(int i = 0; i < sortedArray.length; i++) {
        if(sortedArray[i] == target) return i;
    }
    return -1;
}

Code: Select all

/* Effektiv binär sökning */
int find(int target, int sortedArray[]) {
    int low, high, mid;
    
    low = 0;
    high = sortedArray.length - 1;
    mid = (low+high) / 2;
    while ( low <= high && x != sortedArray[mid] ) {
        if ( target < sortedArray[mid] )
            high = mid - 1;
        else
            low = mid + 1;
        mid = (low+high) / 2;
    }
    if ( target == sortedArray[mid] )
        return mid;
    else
        return -1;
}
Den senare algoritmen är mycket snabbare förutsatt att man har en array med tal som är sorterade. I andra fall får man använda andra algoritmer. Men hursomhelst; det är själva lösningen på problemet som skall vara effektiv, inte hur många rader kod det blir.
Det finns 10 typer av människor i världen: de som kan läsa binärt och de som inte kan det.

User avatar
drbrno
Posts: 2834
Joined: 6 October 2002, 05:01
Location: Lund
Contact:

Post by drbrno » 11 April 2005, 14:14

Märk att andersRson talar om "effektivitet", inte tidsåtgång. En algoritm som sägs vara ineffektiv kanske går snabbare att köra på vissa indata än en "bättre" algoritm. Tänk alltså på att problemen som ineffektiva algoritmer för med sig kanske inte visar sig alls i små Perl-program.

User avatar
jobi
Posts: 347
Joined: 11 May 2005, 23:41
Location: Stockholm
Contact:

Re: Perl och effektiv kod

Post by jobi » 11 May 2005, 23:51

Hasseman wrote:Kan man på något sätt mäta och jämföra två olika beräkningar eller program och på något sätt beräkna i lämplig enhet hur mycket snabbare kod1 är en kod2?
Man kan använda Benchmark-modulen (har du den inte hittar du den på CPAN)

Exempel:

Code: Select all

use Benchmark qw( cmpthese ) ;
$x = 3;
    cmpthese( -5, {
    a => sub{$x*$x},
    b => sub{$x**2},
} );
Ger resultatet

Code: Select all

   Benchmark: running a, b, each for at least 5 CPU seconds...
                  Rate    b         a
   b 1559428/s   --        -62%
   a 4152037/s 166%   --
Av vilket vi ser att subrutin a är 166% snabbare än subrutin b.

lotek
Posts: 200
Joined: 28 May 2003, 12:59
Location: Sydney

Re: Perl och effektiv kod

Post by lotek » 12 May 2005, 13:50

Hasseman wrote:Kan man på något sätt mäta och jämföra två olika beräkningar eller program och på något sätt beräkna i lämplig enhet hur mycket snabbare kod1 är en kod2?
Ett mer teoretiskt satt ar att helt enkelt studera koden och berakna hur tiden som algoritmen tar att berakna vaxer med mer input. Ta tex sokalgoritmerna beskrivna ovan (linjarsokning och binarsokning). Linjarsokning vaxer linjart med listans langd, dvs det i snitt dubbelt sa lang tid att soka i en lista som ar dubbelt sa lang. Det brukar skrivas O(n), vilket utlases "ordo av n" eller "big-O of n". Binarsokning vaxer langsammare, O(log(n). De snabbaste sorteringsalgoritmerna ar O(n * log(n)).

Nagra exempel:

Code: Select all

for(i = 0; i < n; i++)
     i++;
 
har O(n), medans

Code: Select all

for(i = 0; i < n; i++)
     for(j = 0; j < n; j++)
         i++;
har O(n^2)

Post Reply