[alg] Slechtste programmeervoorbeelden deel 4 Vorige deel Overzicht Laatste deel

Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.

Pagina: 1 ... 5 ... 103 Laatste
Acties:
  • 993.540 views

Acties:
  • 0 Henk 'm!

Verwijderd

Below the fold lies a sufficiently sized code sample with everything you’ll need to understand what happened with the Zune 30 bug.
http://www.aeroxp.org/2009/01/lesson-on-infinite-loops/

[ Voor 58% gewijzigd door Verwijderd op 05-01-2009 17:03 . Reden: Oops: gisteren al gepost..double sowy ]


Acties:
  • 0 Henk 'm!

Verwijderd

darkmage schreef op maandag 05 januari 2009 @ 16:23:
[...]

True.

Ik was even confuus met de integral types (sbyte, uint) enz
Een uint (System.Uint32) en sbyte (System.SByte) zijn toch ook gewoon (niet CLS-compliant) structs, net als System.Int32. Aangezien alle intrinsics van value type erven.

[ Voor 10% gewijzigd door Verwijderd op 05-01-2009 18:09 ]


Acties:
  • 0 Henk 'm!

Verwijderd

_Erikje_ schreef op vrijdag 26 december 2008 @ 13:14:
[...]

Het gaat om leesbaarheid van de code, en nu vindt niet iedereen hetzelfde leesbaar. Ook speelt het 1337-heidsgehalte van compacte code een rol, I think.
Als je functies zo groot worden dat die brackets het onleesbaar maken (omdat je enorm veel moet gaans scrollen omdat het zoveel ruimte inneemt) is de functie waarschijnlijk ook gewoon te groot.

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Ik wist niet dat het kon in C#, maar iemand had in een server loop de volgende code:

C#:
1
2
3
4
5
6
public void ServerLoop()
{
    START:
    //server loop gedeelte
    goto start;
}


Ik dacht toch echt dat goto ondertussen al lang en breed verdwenen was. Hoewel het in dit geval niet echt fout of super lelijk is, had ik er zelf toch gewoon een while(true) of while(running) loop van gemaakt :)

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:13

Haan

dotnetter

goto's zijn in C# en Java nog steeds mogelijk, en waarschijnlijk in andere talen ook wel, alleen gebruikt bijna niemand ze meer ;)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Haan schreef op zaterdag 10 januari 2009 @ 11:12:
goto's zijn in C# en Java nog steeds mogelijk, en waarschijnlijk in andere talen ook wel, alleen gebruikt bijna niemand ze meer ;)
In Java en JavaScript niet helaas, ik had het pas nl. nodig. Goto en labels zijn erg handig wanneer je automatisch code laat genereren :)

[ Voor 6% gewijzigd door user109731 op 10-01-2009 11:52 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:13

Haan

dotnetter

Vreemd, ik dacht echt dat Java het ook nog ondersteunde. Ik zal wel in de war zijn met break en continue statements.
Ik kom net wel deze constructie tegen, die wel schijnt te werken, maar alleen terug kan springen en niet vooruit (halve goto dus)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
search:
for (i = 0; i < arrayOfInts.length; i++)
{
    for (j = 0; j < arrayOfInts[i].length; j++) 
    {
        if (arrayOfInts[i][j] == searchfor)
        {
            foundIt = true;
            break search;
        } 
    }
}

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Kettrick
  • Registratie: Augustus 2000
  • Laatst online: 12-09 07:46

Kettrick

Rantmeister!

Haan schreef op zaterdag 10 januari 2009 @ 12:30:
Vreemd, ik dacht echt dat Java het ook nog ondersteunde. Ik zal wel in de war zijn met break en continue statements.
Ik kom net wel deze constructie tegen, die wel schijnt te werken, maar alleen terug kan springen en niet vooruit (halve goto dus)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
search:
for (i = 0; i < arrayOfInts.length; i++)
{
    for (j = 0; j < arrayOfInts[i].length; j++) 
    {
        if (arrayOfInts[i][j] == searchfor)
        {
            foundIt = true;
            break search;
        } 
    }
}
In dit voorbeeld spring je niet terug maar break je de outer loop, waardoor je programma door gaat, lijkt dus absoluut niet op een goto :)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Haan schreef op zaterdag 10 januari 2009 @ 12:30:
Vreemd, ik dacht echt dat Java het ook nog ondersteunde.
Bytecode ondersteunt het ook gewoon. :+

{signature}


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
JanDM schreef op zaterdag 10 januari 2009 @ 11:52:
[...]

In Java en JavaScript niet helaas, ik had het pas nl. nodig. Goto en labels zijn erg handig wanneer je automatisch code laat genereren :)
Wat is het nut van Java-code genereren, als die toch onleesbaar wordt? Maak er dan bytecode van ofzo :/

Acties:
  • 0 Henk 'm!

  • bobo1on1
  • Registratie: Juli 2001
  • Laatst online: 18-05 17:57
Kleine wtf van mezelf:

C:
1
2
3
4
5
6
7
8
9
10
11
    for (i = 0; i < 128; i++)
    {
        if (clients[i].client.sin_addr.s_addr == 0)
        {
            continue;
        }
        else
        {
            sendto(config->sock, "bye", 3, 0, (struct sockaddr *)&clients[i].client, sizeof(clients[i].client));
        }
    }


En nog een bugje :X

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    for (i = 0; i < 128; i++)
    {
        pthread_mutex_lock(&clients[i].clientmutex);

        /*this means a client struct is used*/
        if (clients[i].client.sin_addr.s_addr != 0)
        {           
            /*if the last update of a client has timed out, remove the client*/
            if (tv.tv_sec - clients[i].last_update.tv_sec > (long long int)clients[i].timeout)
            {
                free(clients[i].lights);
                free(clients[i].values);
                memset(clients + i, 0, sizeof(struct config));
            }
        }
        
        pthread_mutex_unlock(&clients[i].clientmutex);
    }

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

MBV schreef op zaterdag 10 januari 2009 @ 16:10:
[...]

Wat is het nut van Java-code genereren, als die toch onleesbaar wordt? Maak er dan bytecode van ofzo :/
Waarom zou je je helemaal moeten gaan verdiepen in Java bytecode generation als je ook gewoon Java code kunt genereren? Al helemaal als je al backends hebt voor talen als C++ en C#, die met minimale aanpassingen ook voor Java code kunnen gaan genereren.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • link0007
  • Registratie: Augustus 2006
  • Niet online
Raging_Trancer schreef op maandag 05 januari 2009 @ 12:43:
[...]


Volgens mij lees je het verkeerd. Wat de query in dit geval doet is alle waarden ophalen van de user met id = "$_COOKIE[id]" uit de tabel "gebruikers". ;)
Ik lees het prima, maar ik vind het een onzinnige constructie. Ik wil helemaal niet blind alle kolommen ophalen, ik wil bepalen wat ik ophaal. Als ik ALLE kolommen wil, dan geef ik wel een lijstje met alle kolomnamen, ipv die rottige *. Kan best zijn dat het een vreemde karaktertrek van mij is, maar ik vind het niet netjes om een * te gebruiken.

-4 uur cup-a-soup modus-: Ik zie het al, ik schreef 'tabellen', maar ik bedoelde 'kolommen' 8)7

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
link0007 schreef op zondag 11 januari 2009 @ 16:24:
Kan best zijn dat het een vreemde karaktertrek van mij is, maar ik vind het niet netjes om een * te gebruiken.
Ligt niet aan jou hoor, altijd lui * selecteren scoort bij praktisch elke bad practice sql lijst vrij goed.

{signature}


Acties:
  • 0 Henk 'm!

  • pieterdebie
  • Registratie: Oktober 2008
  • Laatst online: 28-07-2024
Ik heb in mijn jonge jaren in VB toen ik het bestaan van rekenen met rest in VB niet wist, een programma waar je moest bepalen of een getal even of oneven was op volgende manier opgelost:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
Dim int x
int x = txtInput.text

while x > 1
    x = x - 2
end while

if x = 0 then
    txtOutput.text = "Even"
else
   txtOuput.text  = "Oneven"
end if


De oplossing met mod was natuurlijk wel een stuk sneller :p

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

En als je obscuur wilde doen kon je ook nog een binaire operatie erop loslaten :P

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13-09 20:00

Robtimus

me Robtimus no like you

Obscuur?
Visual Basic:
1
2
3
4
5
If (x And 1) = 0 Then
    even
Else
    odd
End If

Vind ik vrij basic hoor.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Bitwise operaties zijn voor veel mensen niet basic.

En ja, dat is een slechte zaak ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Config
  • Registratie: Januari 2000
  • Laatst online: 06-01 00:49
Het zal wel geen goede reclame zijn voor het pakket waar ik dagelijks voor ontwikkel, maar ik heb ooit eens een aantal eigenaardigheden van SugarCRM op 'papier' gezet: http://www.sugardev.net/content/sugar-humor.

Lichtpuntje: Ze leveren dit soort dingen minder af dan vroeger. Maar oude rotzooi refactoren vinden ze vooralsnog niet nodig bij Sugar.

[ Voor 7% gewijzigd door Config op 11-01-2009 23:41 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
.oisyn schreef op zondag 11 januari 2009 @ 14:53:
[...]

Waarom zou je je helemaal moeten gaan verdiepen in Java bytecode generation als je ook gewoon Java code kunt genereren? Al helemaal als je al backends hebt voor talen als C++ en C#, die met minimale aanpassingen ook voor Java code kunnen gaan genereren.
Zit wat in. Een nadeeltje: o.a. JavaCC liep tegen de beperkingen van verschillende IDE's aan omdat de bestanden toch iets te groot werden ;)

Acties:
  • 0 Henk 'm!

  • !null
  • Registratie: Maart 2008
  • Laatst online: 11-09 14:00
IceManX schreef op zondag 11 januari 2009 @ 18:56:
Obscuur?
Visual Basic:
1
2
3
4
5
If (x And 1) = 0 Then
    even
Else
    odd
End If

Vind ik vrij basic hoor.
Slikte VB dat? Wow.
Ik moet zeggen, in de tijd dat ik er mee werkte wist ik daar ook niks vanaf. Nu wel uiteraard. (en nu wens ik VB nooit meer te gebruiken)

Ampera-e (60kWh) -> (66kWh)


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13-09 20:00

Robtimus

me Robtimus no like you

GreenSky schreef op maandag 12 januari 2009 @ 10:36:
[...]


Slikte VB dat? Wow.
Ik moet zeggen, in de tijd dat ik er mee werkte wist ik daar ook niks vanaf. Nu wel uiteraard. (en nu wens ik VB nooit meer te gebruiken)
Ik heb het ook ooit via-via geleerd, en ik ben het ook met je eens wat betreft VB ;)

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • _Erikje_
  • Registratie: Januari 2005
  • Laatst online: 13-09 21:31

_Erikje_

Tweaker in Spanje

Verwijderd schreef op dinsdag 06 januari 2009 @ 11:58:
[...]


Als je functies zo groot worden dat die brackets het onleesbaar maken (omdat je enorm veel moet gaans scrollen omdat het zoveel ruimte inneemt) is de functie waarschijnlijk ook gewoon te groot.
Daar ben ik het niet helemaal mee eens. De omvang van de functie heeft niets te maken met de complexiteit (en leesbaarheid) van een stuk code.
In sommige gevallen is het juist een verademing als om een functie van een paar pagina's te laten te staan. Decomposeren van functies kan juist de leesbaarheid verslechteren omdat je dan veel nutteloze functies moet definiëren die een bepaald onderdeel van het algoritme uitvoert (die nergens anders hergebruikt).

Ik ben zelf groot voorstander van compacte code, mits het goed gedocumenteerd is. Ik schaam me niet voor statements met meer dan 4 regels commentaar om het uit te leggen wat er precies gebeurt.

on-topic:
Nu zal ik je vertellen dat ik absoluut geen engel ben. Laats nog een stuk über ranzige code gemaakt voor een schoolopdracht. Echt een voorbeeldje van quick and dirty, and it works, so don't touch it 8)7

Ruby:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
   #arbitrary constructor for rushcheck
   #this enables rushcheck to autogenerate a object of this type
   def self.arbitrary

      interest = ["klantklossen", "motorrijden", "fietsen", "wandelen", "fappen", "rimmen", "paupers_slaan"]

      ## DISCLAIMER ##
      ## BLAME THIS ON ERIK SLAGTER ##
      String.arbitrary.bind do |firstName|
         String.arbitrary.bind do |lastName|
            RushCheck::Gen.choose(0, 1).bind do |genderItr|
           RushCheck::Gen.choose(0, 1).bind do |sexPrefItr|
              RushCheck::Gen.choose(1990, 2000).bind do |birthYear|
                 RushCheck::Gen.choose(0, interest.size - 1).bind do |interestItr1|
                        RushCheck::Gen.choose(0, interest.size - 1).bind do |interestItr2|
                           RushCheck::Gen.choose(0, interest.size - 1).bind do |interestItr3|
                  RushCheck::Gen.choose(0, 2).bind do |eduItr|
                         gender = @@genders[genderItr]
                     sexPref = @@sexualPreferences[sexPrefItr]
                     edu = @@educationLevels[eduItr]
                     nonSexPref = interest[interestItr1].to_s + "+" +
                              interest[interestItr2].to_s + "+" + 
                          interest[interestItr3].to_s 
                         RushCheck::Gen.unit(new(firstName, lastName, gender, sexPref, birthYear, edu, nonSexPref))
                  end
               end
            end
             end
                  end
           end
            end
         end
      end
  end


Disclaimertje erbij omdat het een groepsopdracht was 8)
Wat het doet: automatisch variabelen genereren gebruikmakend van RushCheck generators.

Acties:
  • 0 Henk 'm!

  • king_charles
  • Registratie: Maart 2008
  • Laatst online: 15-08-2023
_Erikje_ schreef op maandag 12 januari 2009 @ 22:30:
Echt een voorbeeldje van quick and dirty, and it works, so don't touch it 8)7
* Drukt op enter O-)

[ Voor 74% gewijzigd door king_charles op 12-01-2009 22:50 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
_Erikje_ schreef op maandag 12 januari 2009 @ 22:30:
[...]
Ik ben zelf groot voorstander van compacte code, mits het goed gedocumenteerd is. Ik schaam me niet voor statements met meer dan 4 regels commentaar om het uit te leggen wat er precies gebeurt.
Och, ik heb soms momenten dat ik tussen de 20 en 80 regels commentaar schrijf als ik het nodig acht :-)

Recent voorbeeldje uit een software rasterizer. Het doel is om het juiste mip-map level te selecteren voor de huidige scanline. (De functie word dus een keer per scanline per triangle uitgevoerd). Door de optimalisatie is de functie uitvoer tussen de 20 en 30 keer sneller geworden, echter is 'ie ineens een stuk minder triviaal en komt er redelijk wat wiskunde bij kijken. Kortom, dat moeten we uitleggen aan de (toekomstige) lezer.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// First off a simple explanation about how floating points numbers are 
// stored. Remember scientific notation from high school? 1.34e10 ring a 
// bell? Well, floating point numbers work kinda similar. Except, they use 
// base 2 instead of base 10, so they are stored as 2^n * 0.29834. You 
// can't use n directly though, you have to subtract 127 before it's useful.
// 
// However, this has a very nice property. We can now, quite easily get the 
// integer log2(n) of any floating point number. We simply have to extract n
// somehow. That's easy enough, right? Just ditch the mantissa (eg. the 
// right most 23 bits) and subtract 127.
// 
//      int log2(float a_Float){
//          int log = *(int*)&a_Float;
//          log >>= 23;
//          log -= 127;
//          return log;
//      }
//   
// There are other things you can do with this such as finding the next 
// power of two (just increment n by 1).
// 
// This is one part of the mip-map calculation done. The entire formula that
// I'm sticking to is this:
// 
//      int level = log2(sqrt(area));
// 
// The next problem is tackling the sqrt part. However, it can be shown that
// we can write sqrt(n) in terms of log2.
// 
// First off, as everyone knows,
// 
//      sqrt(n) = n ^ (1/2)
// 
// And also:
// 
//      n = b ^ (log(n) / log(b)) //  b = base
// 
// So:
// 
//      n ^ (1/2) = 2 ^ (log(n ^ (1/2)) / log(2))
// 
// However
//      log(n ^ p) / log(b) = p * (log(n) / log(b))
// 
// So we can reduce the previous expression to:
//      n ^ (1/2) = 2 ^ (1/2 * (log(n) / log(2)))
// 
// So now we have one awesome expression with:
// 
// - 2 ^ something
// - something / 2
// - log2(something)
// 
// This can be written as:
// 
//      int a = 1 >> something; //  2^n
//      a >> 1; //  n / 2
// 
// And a log2(n) function. We already have one of those for floating point
// numbers, but we need one for integers as well (remember, fixed point!).
// 
// Thankfully, though, log2(n) for integers can be done in one instruction
// on the x86! The BSR instruction :-). What that instruction does is count
// the number of bits that are set. How is that log2(n)?
// 
// Well, every number can be expressed as a power of it's base. Eg.
// 
//      b101 = (2 ^ 2 * 1) + (2 ^ 1 * 0) + (2 ^ 0 * 1)
// 
// So 2^n * v. BSR returns the last n that is 1, which is exactly the same
// as the log with base two!
// 
// So, we've solved the puzzle :-) we can now calculate log2(sqrt(n)) in 5
// instructions! (BSR, SAR, MOV, SHL and BSR again)
template<typename _Type>
int mip_map(_Type a_Area){
    return (int)(log(sqrt(a_Area), 2));
}

template<>
int __fastcall mip_map<float>(float a_Area){
    __asm mov ecx, a_Area;

    // integer log2(n)
    // int log2 = *(int*)&a_Area;
    // log2 >>= 23;
    // log2 -= 127;
    __asm sar ecx, 23;
    __asm sub ecx, 127;

    // sqrt(n) = 2 ^ (.5 * log2(n))
    // int sqrt = (1 << (log2 >> 1));
    __asm sar ecx, 1;
    __asm mov eax, 1;
    __asm shl eax, cl;

    // integer log2(n) again
    __asm bsr eax, eax;
}

template<>
int __fastcall mip_map<int>(int a_Area){
    // TODO: decide if this function shifts fixed point, or the caller

    // integer log2(n)
    __asm bsr ecx, ecx;

    // sqrt(n) = 2 ^ (.5 * log2(n))

    // integer sqrt (notice, off by quite a percentage!)
    __asm sar ecx, 1;
    __asm mov eax, 1;
    __asm shl eax, cl;

    // previous error doesn't really matter
    // because we log2(n) again

    // another log2(n)
    __asm bsr eax, eax;
}

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Tja, ik vind het eerlijk gezegd een beetje overdreven. De leek snapt wellicht niet wat shifts en bitscans doen, maar iemand geïnteresseerd in software rasterization zeker wel.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
.oisyn schreef op maandag 12 januari 2009 @ 23:41:
Tja, ik vind het eerlijk gezegd een beetje overdreven. De leek snapt wellicht niet wat shifts en bitscans doen, maar iemand geïnteresseerd in software rasterization zeker wel.
Persoonlijk lees ik in dit geval liever die ~80 regels commentaar dan dat ik over een half jaar zit te peinzen over wat ik heb zitten doen destijds. Daarbij zijn dit soort optimalizaties voor mij ook niet allerdaags en heb ik een deel van de kennis terplekke op moeten doen. Terwijl ik inmiddels toch een jaar met deze materie bezig ben geweest.

Overigens legt het grooste deel van het commentaar de wiskunde achter de optimalizatie uit; iets wat wellicht niet iedereen meteen door heeft. Kortom, voor mezelf kan ik het in ieder geval rechtvaardigen, wat een ander er uiteindelijk mee doet is niet aan mij. Ik heb m'n best gedaan ;-)

Acties:
  • 0 Henk 'm!

Verwijderd

Kwam een mooie tegen in het opensource pakket vTiger 5.0.4 (wat overigens een grote WTF is, maar dat terzijde):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function is_admin($user) {
    global $log;
    $log->debug("Entering is_admin(".$user->user_name.") method ...");

    if ($user->is_admin == 'on')
    {
        $log->debug("Exiting is_admin method ...");
        return true;
    }
    else
    {
        $log->debug("Exiting is_admin method ...");
         return false;
    }
}

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ik vind met name het begin stukje heel erg kinderlijk uitgelegd. Dit soort uitleg is an sich goed, maar mag toch wel gecondenseerd worden naar 20 regels.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Grijze Vos schreef op dinsdag 13 januari 2009 @ 15:21:
[...]

Ik vind met name het begin stukje heel erg kinderlijk uitgelegd. Dit soort uitleg is an sich goed, maar mag toch wel gecondenseerd worden naar 20 regels.
20 Regels gaat mij denk ik niet lukken maar het is waarschijnlijk wel een goed idee om het commentaar iets meer to-the-point te schrijven :-)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13-09 09:39

Janoz

Moderator Devschuur®

!litemod

Dat stuk commentaar lijkt meer op een blog entry dan op commentaar. Het commentaar had imho kunnen volstaan met het vertellen dat de exponent wordt gebruikt voor de log operatie tezamen met de afleiding van de gangbare formule naar de geoptimaliseerde formule.

De grootste WTF is trouwens een andere. In je commentaar staat alleen de 'hoe'. Niet de 'waarom'. Nergens staat dat een aanroep naar mip_map het mip_map level terug geeft en wat die level nu eigenlijk inhoud. Wat nu eigenlijk de a_Area inhoud en wat de extremen van de in- en output parameters zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Kettrick
  • Registratie: Augustus 2000
  • Laatst online: 12-09 07:46

Kettrick

Rantmeister!

.oisyn schreef op maandag 12 januari 2009 @ 23:41:
Tja, ik vind het eerlijk gezegd een beetje overdreven. De leek snapt wellicht niet wat shifts en bitscans doen, maar iemand geïnteresseerd in software rasterization zeker wel.
Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')
Verwijderd schreef op dinsdag 13 januari 2009 @ 15:01:
Kwam een mooie tegen in het opensource pakket vTiger 5.0.4 (wat overigens een grote WTF is, maar dat terzijde):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function is_admin($user) {
    global $log;
    $log->debug("Entering is_admin(".$user->user_name.") method ...");

    if ($user->is_admin == 'on')
    {
        $log->debug("Exiting is_admin method ...");
        return true;
    }
    else
    {
        $log->debug("Exiting is_admin method ...");
         return false;
    }
}
Dit is toch niet enorm vreemd :?

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:
[...]


Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')

[...]


Dit is toch niet enorm vreemd :?
Een boolean geimplementeerd met een string "on"...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:
[...]


Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')

[...]


Dit is toch niet enorm vreemd :?
Ik vind 't toch een vrij omslachtige manier om te checken of een boolean waarde (of iets wat eigenlijk een boolean hoort te zijn) te checken, en die logging is ook nog eens enorm overbodig in mijn ogen. Daarbij lijkt 't me sowieso handiger om deze methode op het object te hebben in plaats van een losse functie.

Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 13-09 17:22
RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:

[...]


Dit is toch niet enorm vreemd :?
En zowel bij true als false wordt het volgende uitgevoerd:

$log->debug("Exiting is_admin method ...");

Dat had dus ook net zo goed voor de if gekund. Als daarnaast de boolean gewoon als boolean geïmplementeerd was, kon je ook nog meteen die waarde returnen en niet eerst door een if halen.

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 12-09 23:23

Guldan

Thee-Nerd

Dat en een nietszeggende logmelding maarja dat gebeurd wel meer.

edit: met hierboven dus :)

[ Voor 18% gewijzigd door Guldan op 13-01-2009 15:58 ]

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • daniëlpunt
  • Registratie: Maart 2004
  • Niet online

daniëlpunt

monkey's gone to heaven

Verwijderd schreef op dinsdag 13 januari 2009 @ 15:55:
[...]


Ik vind 't toch een vrij omslachtige manier om te checken of een boolean waarde (of iets wat eigenlijk een boolean hoort te zijn) te checken, en die logging is ook nog eens enorm overbodig in mijn ogen. Daarbij lijkt 't me sowieso handiger om deze methode op het object te hebben in plaats van een losse functie.
En het lijkt mij ook handig om te weten of $user wel een instance is van de (neem ik aan) User class :) Is niet zo heel erg veel moeite in PHP :
PHP:
1
function is_admin(User $user) { /* */ }

Acties:
  • 0 Henk 'm!

  • Kettrick
  • Registratie: Augustus 2000
  • Laatst online: 12-09 07:46

Kettrick

Rantmeister!

Grijze Vos schreef op dinsdag 13 januari 2009 @ 15:49:
[...]

Een boolean geimplementeerd met een string "on"...
Zolang je geen idee hebt waar die boolean vandaan komt kan je weinig over dit stuk code zeggen ;). Als je om wat voor reden dan ook aan die "on" vast zit is dit juist wel een nette oplossing.

Of je het dan in een class of functie zet hangt weer helemaal af van het gebruik/context.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
daniëlpunt schreef op dinsdag 13 januari 2009 @ 16:11:
[...]

En het lijkt mij ook handig om te weten of $user wel een instance is van de (neem ik aan) User class :) Is niet zo heel erg veel moeite in PHP :
PHP:
1
function is_admin(User $user) { /* */ }
Ehm, ik weet nog een betere:
PHP:
1
$user->isAdmin()

Dan weet je zeker dat het een User is, anders had de functie niet bestaan ;)
Grijze Vos schreef op dinsdag 13 januari 2009 @ 15:49:
[...]

Een boolean geimplementeerd met een string "on"...
Anders was het er niet makkelijker op geworden hoor, je zal in PHP altijd met variabele types zitten ;) Met boolean had je dan weer $is_admin === true moeten neerzetten.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13-09 09:39

Janoz

Moderator Devschuur®

!litemod

RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:
[...]


Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')
Nou, dat valt ook wel weer mee. bitwise operaties zijn gewoon standaard taalconstructies en zeker in dergelijke hoog efficiente code zijn deze behoorlijk triviaal. Dat in een dergelijke context moeten documenteren is hetzelfde als in commentaar zetten dat je met de + twee waarden bij elkaar optelt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

RoeLz schreef op dinsdag 13 januari 2009 @ 15:43:
[...]


Dat is dan weer zo'n gevaarlijke aanname waar iedereen het altijd over heeft :')
Klopt, maar ik denk dat ik wel in de positie ben om die aanname te kunnen maken. Van mensen die bezig zijn met het optimizen van software rasterization kun je weldegelijk aannemen dat ze hun bitfiddle-kennis op orde hebben. Zo niet dan moeten ze ander werk zoeken.

[ Voor 25% gewijzigd door .oisyn op 13-01-2009 16:40 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 13-09 15:32

Sebazzz

3dp

Ik snap nooit dat mensen zulke string booleans gebruiken.
1. Het is langzamer, een bool vergelijken gaat sneller dan een tekenreeks.
2. Je moet een goede standaard voor 'true' en 'false' afspreken.
2b. Het zit mij dwars dat een gegeven dat true of false moet zijn een andere waarde kan hebben waardoor je dus onvoorspelbare dingen krijgt.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Config
  • Registratie: Januari 2000
  • Laatst online: 06-01 00:49
Verwijderd schreef op dinsdag 13 januari 2009 @ 15:01:
Kwam een mooie tegen in het opensource pakket vTiger 5.0.4 (wat overigens een grote WTF is, maar dat terzijde):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function is_admin($user) {
    global $log;
    $log->debug("Entering is_admin(".$user->user_name.") method ...");

    if ($user->is_admin == 'on')
    {
        $log->debug("Exiting is_admin method ...");
        return true;
    }
    else
    {
        $log->debug("Exiting is_admin method ...");
         return false;
    }
}
Das een doorontwikkelde fork van SugarCRM 1.0...holy moly wat je daar al niet tegenkomt..

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Sebazzz schreef op dinsdag 13 januari 2009 @ 18:00:
Ik snap nooit dat mensen zulke string booleans gebruiken.
1. Het is langzamer, een bool vergelijken gaat sneller dan een tekenreeks.
Het was PHP remember? Ik ben wel benieuwd naar een testje waarbij in PHP er een significant verschil is tussen de 2 constructies. PHP moet toch typecasten enzovoort, dus ik denk dat een vergelijking met TRUE ook niet al te snel is.
2. Je moet een goede standaard voor 'true' en 'false' afspreken.
Inderdaad, maar bij legacy (en PHP is al heel snel legacy geloof ik :/) maakt dat dus niet meer uit.
2b. Het zit mij dwars dat een gegeven dat true of false moet zijn een andere waarde kan hebben waardoor je dus onvoorspelbare dingen krijgt.
Hier is 'on' gelijk aan true, en verder niks. Bij if($var) is emptystring, null, de string false en false zelf false. Ik kan me voorstellen dat mensen dat overzichtelijker vinden.

Echt WTF-code wordt het pas zodra je het gaat uitbreiden: "superadmin" zou je ook een functie kunnen geven >:)

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Het valt me tegen dat PHP 'on' niet impliciet cast naar true :+

Bovendien is die "global $log" erg onhandig, en maakt het concat-ten van strings het niet leesbaarder. Een static Log::debug met sprintf-like interface is imho veel mooier:
PHP:
1
Log::debug('is_admin(%s)', $user->user_name);

En zet in die "Exiting is_admin method" op z'n minst welke waarde je teruggeeft... Of nog beter, voeg ze samen in 1 bericht.

[ Voor 28% gewijzigd door user109731 op 13-01-2009 23:11 ]


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Loggen is een klassiek schoolvoorbeeld voor de toepassing van aspect oriented programming om tangling en scattering tegen te gaan, en bij gebrek aan een weaver kunnen we hier denk ik ook gewoon de Proxy pattern toepassen om dit imho eleganter/transparanter op te lossen. Uit de losse sleeve kom ik dan ook op het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class LogProxy {
    protected $delegatee;
    protected $logger;
    
    public function __construct($delegatee, Logger $logger = null) {
        if(is_null($logger)) {
            $this->logger = new Logger();
        }
        
        $this->delegatee = $delegatee;
    }
    
    public function __call($name, $args) {
        assert(method_exists($this->delegatee, $name));
        
        $this->logger->log("Entering $name method ...");
        $result = call_user_func(array(&$this->delegatee, $name), $args);
        $this->logger->log("Exiting $name method ...");
        
        if($result) { // Weet niet precies of dit afdoende is, aan jullie de opdracht om dat uit te zoeken ;-)
            return $result;
        }
    }
}


Voor elk object (en ik realiseer me dat in die CMS van jullie geen sprake is van een object) dien je deze indien je Logger functionaliteit wil gewoon te passen aan LogProxy, e.g.:

PHP:
1
2
3
4
5
6
7
$obj = new MyClassToBeLoggedInDebugMode();

if(DEBUG) {
    $obj = new LogProxy($obj);
}

$obj->foo("bar");


Natuurlijk rekening meehouden dat $obj instanceof LogProxy is indien DEBUG true is, iets waar je rekening mee moet houden als je $obj in typehinted code gebruikt. Je zult dan even je type goed moeten kiezen mbt covariantheid, maar daar kun je wel creatief in zijn ;)

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Wat nou als je alles van je eigen Object laat afstammen, met de member functie getType()? Dan kan je idd geen instanceof gebruiken, maar daar zijn trucs omheen.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MBV schreef op woensdag 14 januari 2009 @ 10:20:
Wat nou als je alles van je eigen Object laat afstammen, met de member functie getType()? Dan kan je idd geen instanceof gebruiken, maar daar zijn trucs omheen.
Kan je niet gewoon de instanceof operator overriden in PHP :+

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

prototype schreef op woensdag 14 januari 2009 @ 03:04:
PHP:
1
2
3
        if($result) { // Weet niet precies of dit afdoende is, aan jullie de opdracht om dat uit te zoeken ;-) 
            return $result; 
        }
Je kunt gewoon direct $result returnen. Wat je nu doet is iig fout, omdat een functie die false, 0, 0.f of een lege string returnt dan genegeerd wordt (en niets returnen is hetzelfde als null returnen)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
rwb schreef op woensdag 14 januari 2009 @ 10:28:
[...]

Kan je niet gewoon de instanceof operator overriden in PHP :+
Alles kan!* Gewoon even de PHP-source hacken, was toch GPL?
*) thee-kan, koffie-kan, water-kan, wim kan niet meer :+

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
MBV schreef op dinsdag 13 januari 2009 @ 21:53:
[...]

Het was PHP remember? Ik ben wel benieuwd naar een testje waarbij in PHP er een significant verschil is tussen de 2 constructies. PHP moet toch typecasten enzovoort, dus ik denk dat een vergelijking met TRUE ook niet al te snel is.
euhm, if($bla) t.o.v. if($bla == <iets>) kost je op zn minst een evaluatie meer natuurlijk.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Grijze Vos schreef op woensdag 14 januari 2009 @ 14:38:
[...]

euhm, if($bla) t.o.v. if($bla == <iets>) kost je op zn minst een evaluatie meer natuurlijk.
Maar de vraag is of dat in PHP een significant performance verschil oplevert. en als <iets> een constante is dan hoeft het niet perse langzamer te zijn, aangezien er zowiezo een comparison moet plaatsvinden. Al zullen numerieke compares natuurlijk sneller zijn dan een string compare

[ Voor 8% gewijzigd door Woy op 14-01-2009 14:50 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Een expressie met een vergelijking tussen twee variabelen (of een var en een constant) is per definitie duurder, aangezien dan die variabelen beiden in de registers moeten worden geplaatst, terwijl dat bij een expressie met maar een variabele natuurlijk niet hoeft.

Of dat verschil significant is hangt af van het aantal expressies waarin dat gebeurd uiteraard.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 13-09 13:25

Patriot

Fulltime #whatpulsert

Grijze Vos schreef op woensdag 14 januari 2009 @ 14:38:
[...]

euhm, if($bla) t.o.v. if($bla == <iets>) kost je op zn minst een evaluatie meer natuurlijk.
Maar een significant verschil is er daardoor nog niet..

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Patriot schreef op woensdag 14 januari 2009 @ 14:53:
[...]


Maar een significant verschil is er daardoor nog niet..
of je leest de laatste regel van mijn post?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Grijze Vos schreef op woensdag 14 januari 2009 @ 14:53:
Een expressie met een vergelijking tussen twee variabelen (of een var en een constant) is per definitie duurder, aangezien dan die variabelen beiden in de registers moeten worden geplaatst, terwijl dat bij een expressie met maar een variabele natuurlijk niet hoeft.
Hoe kom je aan die aanname? Je moet een vergelijking doen. Of die vergelijking met een impliciete true gedaan wordt of een expliciete waarde die je opgeeft, het blijft een vergelijking tussen twee waarden. Als je vergelijkt met een constante (true), dan is het resultaat zelfs exact identiek en is er dus ook geen enkele reden waarom dat op een andere manier gecompileerd zou moeten worden.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cstdlib>

bool a = rand() & 1;
bool b = a & 1;

int main()
{
    if (a)
        std::cout << "hoi\n";
    if (b != false)
        std::cout << "doei\n";
}

GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
004124E0  push        ebp  
004124E1  mov         ebp,esp 
004124E3  and         esp,0FFFFFFF8h 
    if (a)
004124E6  cmp         byte ptr [a (41A081h)],0 
004124ED  je          main+1Ch (4124FCh) 
        std::cout << "hoi\n";
004124EF  push        415488h 
004124F4  call        std::operator<<<std::char_traits<char> > (401C00h) 
004124F9  add         esp,4 
    if (b != false)
004124FC  cmp         byte ptr [b (41A080h)],0 
00412503  je          main+32h (412512h) 
        std::cout << "doei\n";
00412505  push        415490h 
0041250A  call        std::operator<<<std::char_traits<char> > (401C00h) 
0041250F  add         esp,4 
}
00412512  xor         eax,eax 
00412514  mov         esp,ebp 
00412516  pop         ebp  
00412517  ret              

[ Voor 40% gewijzigd door .oisyn op 14-01-2009 15:11 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Helaas werkt dat kennelijk anders in PHP:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
echo "<pre>starting: \n";
list($first_f, $first_s) = explode(" ", microtime());
$prev = $first_f+$first_s;
$var = true;
for ($i = 0; $i < 100000; $i++) {
    if ($var) echo '.';
    else echo ',';
}
echo "\nafter if(\$var):"; echo test_time()."\n";

$var = true;
for ($j = 0; $j < 100000; $j++) {
    if ($var == true) echo '.';
    else echo ',';
}
echo "\nafter if(\$var == true):"; echo test_time()."\n";
$var = "on";
for ($k = 0; $k < 100000; $k++) {
    if ($var == "on") echo '.';
    else echo ',';
}
echo "\nafter if(\$var == \"on\"):"; echo test_time()."\n</pre>";

function test_time(){
     global $prev, $prev;
     list($f,$s) =explode(" ", microtime());
     $now = $f+$s;
     $time = $now - $prev;
     if ($time < 0) $time += 1;
     $prev = $now;
     return $time;
}


after if($var):1.16601610184
after if($var == true):1.66237401962
after if($var == "on"):2.00581383705
nog een keer:
after if($var):1.39411306381
after if($var == true):1.55902409554
after if($var == "on"):1.9059009552

En met een willekeurige string, " std::operator<<<std::char_traits<char> > (401C00h) " op alle plekken:
after if($var):1.12949800491
after if($var == true):2.12889409065
after if($var == "on"):1.52041006088
Nog een keer:
after if($var):1.18337392807
after if($var == true):1.73573708534
after if($var == "on"):1.65470600128

$var = '':
after if($var):1.12168693542
after if($var == true):1.69349598885
after if($var == "on"):1.93431901932

Conclusie? PHP is echt vaag 8)7

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Beetje rare conclusie, met een willekeurige PHP installatie zonder informatie over eventuele code optimizers e.d.. Wat dat betreft kun je er dan ook geen zinnig woord over zeggen.

Met een goede compiler zullen de drie lussen hier identiek zijn, omdat $var invariant is voor de loop en het derhalve op voorhand bekend is wat het resultaat van de evaluatie zal zijn

Overigens performt $var===true iets sneller dan $var==true en iets langzamer dan $var bij mij.

[ Voor 44% gewijzigd door .oisyn op 14-01-2009 16:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Geen optimizer, Debian etch met PHP 4.4.4-8+etch6.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:44
Misgepost in de contest thread, over te grote klassen:

Ah, als we het over te grote source files hebben, weet ik ook nog wel een mooi staaltje. :)

Een aantal universiteiten werken aan een XML database met XQuery support; genaamd MonetDB. Het ding werkt heel aardig (mits je genoeg geheugen hebt) en is modulair opgezet: de basis is een relationele in-memory database server (MonetDB) die alleen binaire tabellen ondersteunt en zorgt voor transacties, persistence, et cetera. De voor gebruikers bedoelde functionaliteit wordt in modules geïmplementeerd die code uitvoeren op de database, waarvoor een low-level (interpreted) taal bestaat (MIL).

Zo is er bijvoorbeeld een module die SQL queries kan vertalen naar MIL code en tabellen omzet in een formaat dat MonetDB efficient kan opslaan. Met die module als front-end en MonetDB als back-end hebben ze dus een efficiënte SQL server gebouwd.

Maar er is dus ook een XML module, genaamd Pathfinder. Die is behoorlijk geavanceerd, vooral waar het optimalisatie van XQuery queries betreft. Voor het verwerken van zo'n query wordt de query eerst geparst in een concrete syntax tree, dan worden er een aantal optimaliserende transformaties overheen gehaald, en tenslotte wordt MIL code gegenereerd om de query daadwerkelijk uit te voeren, en terug te transformeren naar XML.

Ik moet er bij vertellen dat het hele gebeuren geschreven is in C. Er wordt intensief gebruik gemaakt van lex en yacc om allerlei talen (MIL, XQuery, XML, SQL, et cetera) te parsen. Verder wordt er nogal veel gebruik gemaakt van een wat obscure tool genaamd BURG om transformaties op een boomstructuur uit te voeren, wat dus wordt gebruikt om een concrete syntax tree om te zetten in een abstract syntax tree en om alle optimalisaties uit te voeren. Ik had er voor ik dit project tegenkwam ook nooit van gehoord.

Anyway, dit alles om een beetje context te geven. Waar ik naar toe wilde, was de grootte van de broncode. Als ik de handgeschreven broncode van alleen de Pathfinder compiler (nog niet eens de runtime) bekijk, zonder Makefiles of gegenereerde source files, dan tel ik 137603 regels; dat is voor een groot project niet zo schrikbarend, ware het niet dat deze regels verspreid zijn over 103 bestanden. Nu zou je zenuwachtig moeten worden, want dit betekent dat een gemiddelde source file al 1336 regels bevat (bijna 1337 :P).

Neem de top 10 grootste bestanden:
  11792 ./MonetDB4-XQuery/pathfinder/compiler/mil/milprint_summer.c                  
   9631 ./MonetDB4-XQuery/pathfinder/compiler/mil/milgen.brg                         
   6008 ./MonetDB4-XQuery/pathfinder/compiler/sql/lalg2sql.brg                       
   5832 ./MonetDB4-XQuery/pathfinder/compiler/algebra/builtins.c                     
   4551 ./MonetDB4-XQuery/pathfinder/compiler/algebra/logical.c                      
   4082 ./MonetDB4-XQuery/pathfinder/compiler/core/fs.brg                            
   3623 ./MonetDB4-XQuery/pathfinder/compiler/algebra/physical.c                     
   3536 ./MonetDB4-XQuery/pathfinder/compiler/algebra/planner.c                      
   3466 ./MonetDB4-XQuery/pathfinder/compiler/algebra/core2alg.brg                   
   3152 ./MonetDB4-XQuery/pathfinder/compiler/algebra/map/intro_proxy.c

Holy shit! Duizenden regels broncode per bestand! milprint_summer.c heet zo omdat gebaseerd is op code die een student in een zomerproject geschreven heeft. Bijna twaalfduizend regels! Ik moet er niet aan denken al die code te moeten lezen, laat staan schrijven!

Het is overigens behoorlijk nette code. Er staat ook regelmatig zinnig commentaar in (maar minder dan de helft van de tekst; d.w.z. het merendeel is wel echt code) en er zijn geen TheDailyWTF-waardige constructies waarbij een stukje tekst duizend keer gecopypaste wordt omdat de auteur niet bekend is met het fenomeen for-loop.

Overigens zijn dit alleen handgeschreven source files; tools als lex, yacc en BURG genereren hiervan weer C source files die nog véél groter zijn; zo erg zelfs dat ik de boel met GCC niet mét optimalisaties kan compileren omdat de tussentijdse datastructuren niet in mijn 1 GB geheugen passen. (GCC houdt dan alle functies in het geheugen om inter-functie optimalisaties als inlining te kunnen toepassen.)

De moraal van dit verhaal: ik weet niet precies wanneer een source file té groot wordt, maar ik vermoed dat rond een regel of 5000 de grens van het betaambare wel overschreden is.

Acties:
  • 0 Henk 'm!

Verwijderd

Soultaker schreef op woensdag 14 januari 2009 @ 16:55:
De moraal van dit verhaal: ik weet niet precies wanneer een source file té groot wordt, maar ik vermoed dat rond een regel of 5000 de grens van het betaambare wel overschreden is.
Dan nodig ik je van harte uit enkele van de Progress source-files te komen bekijken, alles ongedocumenteerd, ongestructureerd, redundant en voorzien van een behoorlijk hoog WTF niveau op een niet gering aantal plekken.
De grootste, die ik tot nu toe gezien heb, is ruimschoots over de 8000 regels, waarvan, naar schatting, 5% (slecht, nietszeggend) commentaar is.
De erfenis van een pakket met roots van +25 jaar oud wat we aan het overbouwen zijn naar .NET, de aspirines liggen altijd binnen handbereik zal ik maar zeggen :+

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
@Soultaker: En dat vind je erg? Wat dacht je van 1 bestand met 33642 regels COBOL-code? :+

Ik heb geen idee hoeveel daarvan gegenereerd is, bovenaan staat 'generation result of MAESTRO II', maar wat ik heb gehoord deed dat ding heel weinig.
offtopic:
Ik heb nog steeds geen NDA getekend, dus geen idee of dit al teveel informatie is... :X == WTF op stageplek

[ Voor 18% gewijzigd door MBV op 14-01-2009 17:10 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:44
MBV schreef op woensdag 14 januari 2009 @ 17:09:
En dat vind je erg? Wat dacht je van 1 bestand met 33642 regels COBOL-code? :+
Ja, ik vind dat erg ja. :X Als source files van duizenden regels de norm zijn, is je project toch een beetje ontspoort. (Ik zou die code niet willen onderhouden!)
Verwijderd schreef op woensdag 14 januari 2009 @ 17:02:
Dan nodig ik je van harte uit enkele van de Progress source-files te komen bekijken, alles ongedocumenteerd, ongestructureerd, redundant en voorzien van een behoorlijk hoog WTF niveau op een niet gering aantal plekken.
Ik denk dat je het niet erg vind als ik dit aanbod afsla. :+

Het verbaast me overigens niet dat dit blijkbaar wel vaker voorkomt, maar toch... 8)7

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

.oisyn schreef op woensdag 14 januari 2009 @ 11:02:
[...]


Je kunt gewoon direct $result returnen. Wat je nu doet is iig fout, omdat een functie die false, 0, 0.f of een lege string returnt dan genegeerd wordt (en niets returnen is hetzelfde als null returnen)
Yeah ik zat even te twijfelen ook wat er gebeurde in de situatie dat call_user_func een void functie zou aanroepen, maar volgens mij kan je gewoon meteen returnen idd.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Soultaker schreef op woensdag 14 januari 2009 @ 17:23:
[...]

Ja, ik vind dat erg ja. :X Als source files van duizenden regels de norm zijn, is je project toch een beetje ontspoort. (Ik zou die code niet willen onderhouden!)
Wat dacht je van het magic word 'COBOL'? Ook software moet je af en toe afschrijven, na 40 jaar trouwe dienst is dat niet onverstandig :X
[...]

Ik denk dat je het niet erg vind als ik dit aanbod afsla. :+

Het verbaast me overigens niet dat dit blijkbaar wel vaker voorkomt, maar toch... 8)7
Meestal legacy waarbij het voorkomt, niemand begint met 10.000 regels. Soms zou opsplitsen de code alleen maar onoverzichtelijker maken, maar meestal wordt er aan een bestand van 1000 regels 100 regels toegevoegd, en nog eens, en nog eens... Het zou wel leuk zijn om eens naar te kijken, maar ik heb geen geschiedenis van de COBOL-code waar ik het over had. Had ik bij mijn HBO-stage wel kunnen bekijken, maar daar kom ik niet meer in. Shell had de beveiliging best goed opgezet ;)

Acties:
  • 0 Henk 'm!

  • Blonde Tux
  • Registratie: Januari 2008
  • Laatst online: 03-09 15:05

Blonde Tux

<advertisement>

Niet slecht als in bad, maar slecht als in evil(No worries, geen virussen of malware oid):
http://www.lagzero.net/
en dan de source code even bekijken.

Heet zand zand omdat het tussen zee en land ligt?


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 13-09 15:32

Sebazzz

3dp

Hahaha :D

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 13-09 20:39
Zelfs als ASCII- art ziet het er nog ranzig uit -O-

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 09:12
Blonde Tux schreef op woensdag 14 januari 2009 @ 20:26:
Niet slecht als in bad, maar slecht als in evil(No worries, geen virussen of malware oid):
http://www.lagzero.net/
en dan de source code even bekijken.
De persoon die dit in de source heeft verwerkt heeft een erg zieke geest.

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
Je genereert wel een boel traffic, door al die mensen die even de source komen bekijken.

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:13

Haan

dotnetter

Die link is niet bepaald GoT-policy proof hè.. >:)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Hier heb ik zonet meer dan een half uur op zitten kijken, testen en editen. Mijn pc vloog bijna het raam uit.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function searchRow($playField, $width, $heigth) {
    // Horizontal
    for ($o = 1; $o <= $heigth; $o++) {
        for ($i = 1; $i <= ($width - 3); $i++) {
            if (($playField[$i][$o] != '')
            && ($playField[$i][$o] == $playfield[$i + 1][$o]) 
            && ($playField[$i][$o] == $playfield[$i + 2][$o])
            && ($playField[$i][$o] == $playfield[$i + 3][$o])) {
                return ($playfield[$i][$o] . '-Horizontal');
            }
        }
    return FALSE;
    }
}


Natuurlijk keert dit steeds fout terug, ook bij een array volledig bezet met hetzelfde teken |:(
Natuurlijk krijg ik nu geen rij terug.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
MBV schreef op woensdag 14 januari 2009 @ 16:41:
Geen optimizer, Debian etch met PHP 4.4.4-8+etch6.
Pak je ook wel een goede versie mee, 5.2.8 is alweer een paar weken uit... PHP4 is al jaren depricated.

edit: wat voor slome server test je dat op? Op mijn niet-belachelijk-snelle server:

code:
1
2
3
4
starting: 
after if($var):0.0337429046631
after if($var == true):0.0222730636597
after if($var == "on"):0.0260539054871

[ Voor 30% gewijzigd door Cartman! op 15-01-2009 23:11 ]


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Vergelijk hem nu eens met if($var == "dit is een hele lange string") waarbij $var = "dit is een hele lange string". Ik wil even kijken of PHP aan string interning doet bij ==, of dat hij gewoon die strings lineair terplekke vergelijkt en dus van de orde O(n) is. Benchmark daarbij dus even met verschillende lengtes, i.e. een string die twee keer zo lang is en kijk of de tijd ook gelijkmatig oploopt. Dat zijn interessantere benchmarks imo. "on" is slechts 2 karakters en geeft niet zo'n goed beeld hierover. Grotere inputsizes geven een beter beeld.

[ Voor 5% gewijzigd door prototype op 16-01-2009 00:11 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
K6-2 500MHz, doet het prima als fileserver en de webserver wordt toch wel beperkt door de ADSL-lijn van mijn ouders. 30 watt, beat that! (EEE-box staat te trappelen voor de vervanging, en PHP5 zou veel sneller moeten zijn)
offtopic:
Eigenlijk zou ik mijn server naar mijn kamer met UPC moeten halen, maar dan moet ik het DNS weer aanpassen enzo. Gezien een paar plannen ga ik denk ik voor een hoster die €5 vraagt voor een server met 10GB schijfruimte :)


@Prototype: Ja doei, installeer maar XAMPP of pak een livecd van Ubuntu :w

Dit is niet het 'hoe baggertraag is PHP'-topic (heel traag: debian shootout), maar slechte programmeervoorbeelden-topic.

[ Voor 31% gewijzigd door MBV op 16-01-2009 00:17 ]


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

MBV schreef op vrijdag 16 januari 2009 @ 00:12:
@Prototype: Ja doei, installeer maar XAMPP of pak een livecd van Ubuntu :w

Dit is niet het 'hoe baggertraag is PHP'-topic (heel traag: debian shootout), maar slechte programmeervoorbeelden-topic.
Hey, ik begon er niet mee he? ;) Hier komt PHP er iig niet op :P

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

after if($var):0.0260169506073
after if($var == true):0.0304319858551
after if($var == "on"):0.0354740619659
after if($var == "Dit is een heel erg lange string!!!1111pppp"):0.0444598197937
after if($var == "Dit is een heel erg lange string!!!1111pppp" (x10)):0.122269153595


Het mooie is, de code in de laatste loop doet een if ($var == $var2) omdat ik geen zin had de string 10x achter elkaar in de code te zetten. Dus om je vraag te beantwoorden: nee, hij doet niet aan string interning.

PHP 5.6.2 mét Zend optimizer. Prutswerk dus.

[ Voor 32% gewijzigd door .oisyn op 16-01-2009 02:06 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Kijk, dat verklaart ook waarom mijn server een factor 30 langzamer is dan die van Cartman. Zend optimizer is niet echt GPL, dus die zit niet in Debian ;) En zoals al gezegd: voor mij is het niet spannend, die internetverbinding is de bottleneck.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
.oisyn schreef op woensdag 14 januari 2009 @ 15:06:
[...]

Hoe kom je aan die aanname? Je moet een vergelijking doen. Of die vergelijking met een impliciete true gedaan wordt of een expliciete waarde die je opgeeft, het blijft een vergelijking tussen twee waarden. Als je vergelijkt met een constante (true), dan is het resultaat zelfs exact identiek en is er dus ook geen enkele reden waarom dat op een andere manier gecompileerd zou moeten worden.
Ik wist niet dat de compiler dat zo zou implementeren. Met het beetje kennis van Z80 assembly weet ik dat je equality to 0 met een goedkopere processor instructie checken. Bovendien kun je dat ook implementeren als een conditionele jump instructie a.d.h.v. een register value die al dan niet 0 is. Dan hoef je dus helemaal geen compare uit te voeren.

[ Voor 3% gewijzigd door Grijze Vos op 16-01-2009 11:16 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Grijze Vos schreef op vrijdag 16 januari 2009 @ 11:13:
Ik wist niet dat de compiler dat zo zou implementeren. Met het beetje kennis van Z80 assembly weet ik dat je equality to 0 met een goedkopere processor instructie checken. Bovendien kun je dat ook implementeren als een conditionele jump instructie a.d.h.v. een register value die al dan niet 0 is. Dan hoef je dus helemaal geen compare uit te voeren.
Volgens mij jump je altijd conditioneel op een status vlag/bit, vnl SF (sign flag) en ZF (zero flag). Een aantal berekeningen zetten die flags, en compares doen dat zonder verdere side-effects. Als je doet "cmp eax,4" dan doet hij intern "eax - 4" en zet dan SF en ZF. Een "jne" is dan "jump if not ZF", een "jg" wordt "jump if SF". Een conditional jump doet dus zelf geen daadwerkelijke berekeningen, maar checked gewoon altijd een of twee vlaggen. In een loop hoef je ook geen compare te doen, want als ik een counter decrease "dec ecx", dan kan ik meteen kijken of het resultaat 0 is door de ZF te inspecteren. Een volgende "jnz" werkt dan gewoon.

( http://books.google.com/b...1&ct=result#PRA1-PA292,M1 )

[ Voor 10% gewijzigd door Zoijar op 16-01-2009 12:03 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Voor de volledigheid, een cmp is identiek aan een sub zonder resultaat, en een test is identiek aan een and zonder resultaat :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 07:39
Verwijderd schreef op donderdag 15 januari 2009 @ 22:45:
Hier heb ik zonet meer dan een half uur op zitten kijken, testen en editen. Mijn pc vloog bijna het raam uit.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function searchRow($playField, $width, $heigth) {
    // Horizontal
    for ($o = 1; $o <= $heigth; $o++) {
        for ($i = 1; $i <= ($width - 3); $i++) {
            if (($playField[$i][$o] != '')
            && ($playField[$i][$o] == $playfield[$i + 1][$o]) 
            && ($playField[$i][$o] == $playfield[$i + 2][$o])
            && ($playField[$i][$o] == $playfield[$i + 3][$o])) {
                return ($playfield[$i][$o] . '-Horizontal');
            }
        }
    return FALSE;
    }
}


Natuurlijk keert dit steeds fout terug, ook bij een array volledig bezet met hetzelfde teken |:(
Natuurlijk krijg ik nu geen rij terug.
Of ik ben scheel, of ik zie echt niet wat hier nu fout gaat, behalve dat je na de 1e rij ($o) FALSE terug geeft omdat de return in de $o loop staat.

Edit: Nevermind.Ik was vergeten dat PHP case sensitive is met variablen :o

[ Voor 3% gewijzigd door ShadowLord op 16-01-2009 13:45 ]

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 12-09 14:10
ShadowLord schreef op vrijdag 16 januari 2009 @ 13:40:
[...]

Of ik ben scheel, of ik zie echt niet wat hier nu fout gaat, behalve dat je na de 1e rij ($o) FALSE terug geeft omdat de return in de $o loop staat.
Nouja ik vind het sowieso een heel aparte manier ..trouwens, hij kijkt verticaal niet horizontaal ;)

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 13-09 13:25

Patriot

Fulltime #whatpulsert

Grijze Vos schreef op woensdag 14 januari 2009 @ 15:01:
[...]

of je leest de laatste regel van mijn post?
Daar was ik nog niet met lezen, ik had immers ook een andere post gequote. Ik had niet gekeken of jij het die tweede keer ook was.

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 13-09 16:23

Salandur

Software Engineer

Verwijderd schreef op donderdag 15 januari 2009 @ 22:45:
Hier heb ik zonet meer dan een half uur op zitten kijken, testen en editen. Mijn pc vloog bijna het raam uit.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function searchRow($playField, $width, $heigth) {
    // Horizontal
    for ($o = 1; $o <= $heigth; $o++) {
        for ($i = 1; $i <= ($width - 3); $i++) {
            if (($playField[$i][$o] != '')
            && ($playField[$i][$o] == $playfield[$i + 1][$o]) 
            && ($playField[$i][$o] == $playfield[$i + 2][$o])
            && ($playField[$i][$o] == $playfield[$i + 3][$o])) {
                return ($playfield[$i][$o] . '-Horizontal');
            }
        }
    return FALSE;
    }
}


Natuurlijk keert dit steeds fout terug, ook bij een array volledig bezet met hetzelfde teken |:(
Natuurlijk krijg ik nu geen rij terug.
ik vermoedt het het in de schrijfwijze van $playField zit die niet altijd hetzelfde is :)

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik vermoed (zonder t) simpelweg het niet aanzetten van error reporting (met iig E_NOTICE). Had een hoop tijd gescheeld.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
De return FALSE; staat binnen de eerste for loop, dat klopt toch niet?

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

Michali schreef op vrijdag 16 januari 2009 @ 15:51:
De return FALSE; staat binnen de eerste for loop, dat klopt toch niet?
Da's WTF nummer 2 ;)

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
WTF nummer 3 is dat hij nog geen PHP debugger gebruikt. Installeer Eclipse met PDT, en je ziet dit soort fouten direct!

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

vs.php ftw! ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

.oisyn schreef op vrijdag 16 januari 2009 @ 02:02:
after if($var):0.0260169506073
after if($var == true):0.0304319858551
after if($var == "on"):0.0354740619659
after if($var == "Dit is een heel erg lange string!!!1111pppp"):0.0444598197937
after if($var == "Dit is een heel erg lange string!!!1111pppp" (x10)):0.122269153595


Het mooie is, de code in de laatste loop doet een if ($var == $var2) omdat ik geen zin had de string 10x achter elkaar in de code te zetten. Dus om je vraag te beantwoorden: nee, hij doet niet aan string interning.

PHP 5.6.2 mét Zend optimizer. Prutswerk dus.
En kijk, dit verbaast me nou helemaal niks dus he. Zelfs met een "optimizer" kon deze string literal niet even ge-interned worden om tot een constant time == te komen... De code laat het iig harstikke hard toe... tijdens compiletime was alles bekend zeg maar, immers krijgt $var niet in de tussentijd nog even een andere variabele toegekend die pas tijdens runtime ofzo bekend zou zijn. Dat doen andere talen toch net even iets beter door gewoon in dergelijke situaties de strings te internen en de vergelijking op "object id's/hashcodes" te laten plaatsvinden. Huilie huilie dus...

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Je bedoelt PHP.NET? :X

Kent iemand trouwens een PHP applicatie van meer dan 3 jaar oud, dat nog niet wordt gezien als Legacy-code? :X

Oh ja, ook minstens 50 KLOC, anders telt het niet als grote applicatie ;)

[ Voor 12% gewijzigd door MBV op 16-01-2009 20:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Nee, vs.php, een plugin voor Visual Studio :)

Op de site:
VS.Php is a Php IDE (integrated development environment) based on Visual Studio IDE. With VS.Php you can design, develop, debug and deploy Php applications within the Visual Studio IDE. VS.Php key features are around providing rich Php editor as well as Smarty editing capabilities. Also is the ability to debug Php scripts locally as well as remotely.
Amazing, Mike!

[ Voor 81% gewijzigd door Verwijderd op 16-01-2009 20:20 ]


Acties:
  • 0 Henk 'm!

  • Config
  • Registratie: Januari 2000
  • Laatst online: 06-01 00:49
*auw auw auw*
PHP:
1
2
3
4
5
6
7
8
9
10
11
Index: 5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
===================================================================
--- a/5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
+++ b/5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
@@ -232,5 +232,5 @@
         function mark_deleted($id) {
                 parent::mark_deleted($id);
-                $q = "update inbound_email set groupfolder_id = null";
+                $q = "update inbound_email set groupfolder_id = null WHERE id = $id";
                 $r = $this->db->query($q);
                 $this->deleteCache();

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Ja die update is wel handig ja :+

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Topicstarter
Ik hoop dat je die niet in productie gedraaid hebt? :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Config schreef op zondag 18 januari 2009 @ 03:16:
*auw auw auw*
PHP:
1
2
3
4
5
6
7
8
9
10
11
Index: 5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
===================================================================
--- a/5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
+++ b/5.1/SugarCE-Full-5.1.0/modules/InboundEmail/InboundEmail.php
@@ -232,5 +232,5 @@
         function mark_deleted($id) {
                 parent::mark_deleted($id);
-                $q = "update inbound_email set groupfolder_id = null";
+                $q = "update inbound_email set groupfolder_id = null WHERE id = $id";
                 $r = $this->db->query($q);
                 $this->deleteCache();
Bekend :$

Leve PIT-recovery :P

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:13

Haan

dotnetter

Hèhè iets vergelijkbaars heeft mijn voorganger een keer op de productieomgeving van een klant gedaan, waardoor in een klap alle records van een bepaalde entiteit gewist werden. Het werd pas echt zuur toen daarna ook nog eens bleek dat er geen backup gedraaid kon worden, ik weet niet meer precies hoe dat zat, maar het was niet helemaal goed geconfigureerd :X

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 09:12
mmm, misschien lees ik er overheen maar er wordt toch alleen maar een entity verwijderd waarvan de groupfolder null is en het ID klopt met datgene wat er is opgegeven. Dat de parent wordt verwijdert is de echte fout (maar dat kan ik niet bepalen aan de hand van de opgegeven code ,ken de context niet ).
De eerste declaratie van $q is toch overschreven door de tweede?

ik ga er even van uit dat voor het aanroepen van deze methode al is gecontrolleerd of de ID geldig is etc..

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Webgnome schreef op zondag 18 januari 2009 @ 11:09:
mmm, misschien lees ik er overheen maar er wordt toch alleen maar een entity verwijderd waarvan de groupfolder null is en het ID klopt met datgene wat er is opgegeven. Dat de parent wordt verwijdert is de echte fout (maar dat kan ik niet bepalen aan de hand van de opgegeven code ,ken de context niet ).
De eerste declaratie van $q is toch overschreven door de tweede?

ik ga er even van uit dat voor het aanroepen van deze methode al is gecontrolleerd of de ID geldig is etc..
Het is een diff. Deze patch haalt de regel met een - ervoor weg en plaatst een regel met de + ervoor. Oftewel, de query wordt aangepast want hij was niet zoals bedoeld :p
Pagina: 1 ... 5 ... 103 Laatste

Dit topic is gesloten.

Let op:
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes. :)