Gathering of Tweakers

Quicksearch
Schietende bloemen bijten wel!

quote:
Vich schreef op donderdag 16 augustus 2007 @ 16:35:
Kom ik net dit tegen...
C++:
1
2
3
4
5
6
if (x)
    if (y)
        if (z)
        {
            // Uiteindelijke code
        }

:X
Dit kan wel degelijk nut hebben als y en z functies zijn die veel tijd kosten. De volgorde van uitvoering bij een and is - in ieder geval bij C/C++ - niet strikt gedefinieerd, waardoor bovenstaande code vele malen sneller kan zijn dan
C++:
1
if ( x() && y() && z() ) {}

zeker als je compiler bij een dergelijke constructie van rechts naar links werkt en al helemaal als x() en y() vaak false opleveren.

``Some people, when confronted with a problem, think `I know, I'll use regular expressions.' Now they have two problems. --jwz''
Remember 23/10 - Wordt het wafflehat, o2 of toch moo?

Berichten: 3767
Reg. datum: 28 april 2000

Ik dacht dat de evaluatie volgorde van condities in een if statement gewoon gegarandeerd word in c++. Bij een function call is inderdaad niet gedefineerd in welke volgorde ze uitgevoerd worden waardoor je met het volgende nooit weet welke i waar meegegeven wordt
C++:
1
myFuncii++ );

To be, or not to be, those are the parameters

heeft een echte avatar

quote:
rwb schreef op vrijdag 31 augustus 2007 @ 08:09:
Ik dacht dat de evaluatie volgorde van condities in een if statement gewoon gegarandeerd word in c++.
Inderdaad, wat is anders het nut van de shortcut (lazy) logical operators?

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

quote:
ValHallASW schreef op vrijdag 31 augustus 2007 @ 01:32:
[...]

Dit kan wel degelijk nut hebben als y en z functies zijn die veel tijd kosten. De volgorde van uitvoering bij een and is - in ieder geval bij C/C++ - niet strikt gedefinieerd, waardoor bovenstaande code vele malen sneller kan zijn dan
Sorry, maar totale onzin. && en || doen aan short-circuiting, waarbij de lhs wordt geevalueerd vóór de rhs (waarbij de uitkomst van de lhs mogelijk ervoor zorgt dat de rhs niet eens meer geevalueerd hoeft te worden). Daarom werkt dit gewoon fatsoenlijk:
C++:
1
2
3
4
5
6
7
void DoeIets(MyClass * ptr)
{
    if (ptr && ptr->DoeIets())
        DoeIetsAnders();
    else
        DoeLekkerNiets();
}

Zoals in alle vergelijkbare talen (C, C#, Java, VB, PHP, JS, Python, ...)

.oisyn wijzigde dit bericht 31-08-2007 11:08 (18%)

VB, dat dacht je maar!
Om in VB.NET toch shortcircuiting te kunnen gebruiken hebben ze juist de keywords AndAlso en OrElse toegevoegd. Nee, echt :D

... is first and foremost, a state of mind, a spirit

quote:
kenneth schreef op vrijdag 31 augustus 2007 @ 11:12:
VB, dat dacht je maar!
Om in VB.NET toch shortcircuiting te kunnen gebruiken hebben ze juist de keywords AndAlso en OrElse toegevoegd. Nee, echt :D
true, niet alle talen doen aan Short-circuit_evaluation
zie ook:
http://en.wikipedia.org/wiki/Short-circuit_evaluation
http://en.wikipedia.org/wiki/Category:Programming_evaluation

btw,
in vb(.net) hebben ze ook een iif, wat vergelijkbaar is met de shorthand
a = b?c:d;

Nadeel is dat omdat vb(.net) niet aan sce doet dat zowel c als d moeten evalueren.
dus dit kan niet:
Visual Basic .NET:
1
a = iif(b.length > 0b(0), nothing)

BasieP wijzigde dit bericht 31-08-2007 11:22 (32%)

|| This message was sent on 100% recyclable electrons. || basiep.nl || mijn fotos || Tent75 ||

quote:
Toen hield ik op met lezen.


:+

... is first and foremost, a state of mind, a spirit

quote:
kenneth schreef op vrijdag 31 augustus 2007 @ 11:22:
[...]
Toen hield ik op met lezen.


:+
en bedankt voor je nuttige bijdrage :/
(wat moet je nou met zo'n reactie?)

|| This message was sent on 100% recyclable electrons. || basiep.nl || mijn fotos || Tent75 ||

lazy evaluation ... ik zie "true" staan en hou op met lezen ... 't was een grapje :P

... is first and foremost, a state of mind, a spirit

Kruimeltjes zijn weer op :9

iif stamt nog uit de oude VB6 tijd;
Bedoel je iets als:
Visual Basic .NET:
1
If b.lenght > 0 THEN a = b(0ELSE a = Nothing

Berichten: 3767
Reg. datum: 28 april 2000

quote:
kenneth schreef op vrijdag 31 augustus 2007 @ 11:12:
VB, dat dacht je maar!
Om in VB.NET toch shortcircuiting te kunnen gebruiken hebben ze juist de keywords AndAlso en OrElse toegevoegd. Nee, echt :D
Dan is "And" dus gewoon de binaire operator? of niet?

Op zich is dat nog niet zo vreemd. Welke keywords er gebruikt worden is natuurlijk niet echt heel erg interessant.

To be, or not to be, those are the parameters

Schietende bloemen bijten wel!

quote:
.oisyn schreef op vrijdag 31 augustus 2007 @ 11:06:
[...]

Sorry, maar totale onzin. && en || doen aan short-circuiting, waarbij de lhs wordt geevalueerd vóór de rhs (waarbij de uitkomst van de lhs mogelijk ervoor zorgt dat de rhs niet eens meer geevalueerd hoeft te worden).
Ik was inderdaad in de war met de evaluation bij functies, en ik dacht dus dat de volgorde bij && en || niet gedefinieerd was. Dan nog kan het voor de duidelijkheid zinvol zijn meerdere ifs op te nemen, maar het nut wordt inderdaad een stuk minder ;)

``Some people, when confronted with a problem, think `I know, I'll use regular expressions.' Now they have two problems. --jwz''
Remember 23/10 - Wordt het wafflehat, o2 of toch moo?

quote:
gorgi_19 schreef op vrijdag 31 augustus 2007 @ 11:30:
iif stamt nog uit de oude VB6 tijd;
Bedoel je iets als:
Visual Basic .NET:
1
If b.lenght > 0 THEN a = b(0ELSE a = Nothing

nou ik bedoelde gewoon iif, omdat dit een functie is, en geen native taal ding, worden zowel de true part als de false part ge-evalueerd ongeacht het resultaat van de conditie.

In jouw geval if/then/else wordt gewoon alleen 'then' of alleen 'else' geevalueerd, afhankelijk van de conditie.

wat wel veel voorkomt in vb is bijv zoiets:
Visual Basic .NET:
1
if not a is nothing And a.size > 0 then ....

Waarbij hij niet lazy is, en dus bij a.size een exception geeft. (daar is die andalso dus voor)

|| This message was sent on 100% recyclable electrons. || basiep.nl || mijn fotos || Tent75 ||

quote:
BasieP schreef op vrijdag 31 augustus 2007 @ 11:17:
[...]

true, niet alle talen doen aan Short-circuit_evaluation
zie ook:
http://en.wikipedia.org/wiki/Short-circuit_evaluation
Pff C++ stond er niet eens bij, 'k heb 'm geadd :P
Ik meen me te herinneren dat Object Pascal (Delphi) ook een cand en cor had voor shortcircuiting. Kan zijn dat in nieuwere versies dit standaard is geworden.

Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."

Berichten: 1830
Reg. datum: 22 januari 2004

quote:
BasieP schreef op vrijdag 31 augustus 2007 @ 11:23:
[...]

en bedankt voor je nuttige bijdrage :/
(wat moet je nou met zo'n reactie?)
Short circuit reading?

Whereas Europeans generally pronounce my name the right way ('Nick-louse Veert'), Americans invariably mangle it into 'Nickel's Worth.' This is to say that Europeans call me by name, but Americans call me by value - Niklaus Wirth

heeft een echte avatar

Wat dacht je van deze:
Java:
1
2
3
4
5
6
7
8
9
10
11
private static void blockIndefinitely()
{
    while(true)
    {
        try
        {
            Thread.sleep(100L);
        }
        catch(Exception exception) { }
    }
}

Allereerst: een catch-all zonder body :X

Ten tweede: elke 100ms wordt deze thread wakker, om vervolgens weer keihard in slaap te vallen. Ik zie het al gebeuren, 's nachts elke 10 minuten:
Iemand: WAKKER WORDEN!!!
* IceManX : Huh? Wat is er?
Iemand: Ga maar lekker slapen.

Ik zou gek worden en die persoon flink in elkaar beuken.

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

Wat is het nut van die functie?

Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."

IMHO --->

@IceManX:

"Hey Bert, slaap je al?"

I'm always thinking one step ahead, like a carpenter - who makes stairs

heeft een echte avatar

quote:
De functie naam zegt het toch al? Blokkeer voor altijd.

Op zich al erg genoeg dat ze een hele thread willen laten deadlocken, maar doe het dan wat efficienter. Bv zo:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Object o = new Object();
while (true)
{
    synchronized (o)
    {
        try
        {
            o.wait();
        }
        catch (InterruptedException e)
        {
            // at least LOG the freaking exception!
        }
    }
}

1) Geen catch all maar alleen de exception die gecaught MOET worden.
2) doe iets met die exception, al is het maar loggen
3) blocken dmv synchronisatie. Zolang er geen andere thread notify() of notifyAll() op dat object roept blijft hij wachten. Aangezien geen andere thread een reference naar dat object heeft gebeurt dat dus nooit. Alleen door de thread te interrupten kun je uit die o.wait() komen, hence the loop.

Op deze manier wordt de thread niet tenminste elke keer weer geactiveerd.


Dit prachtige stukje code komt trouwens uit een professioneel pakket dat wij gebruiken. Ditzelfde pakket krijgt het voor elkaar om, zodra je een mailtje van 10MB opent, het geheugengebruik met zo'n 180MB te laten toenemen. Sluit je het mailtje dan wordt dat geheugen niet vrijgegeven, en als je hetzelfde mailtje nog een keer opent neemt het programma gewoon nog meer geheugen in beslag.

Needless to say dat het regelmatig voorkomt dat er OutOfMemoryErrors worden gethrowd wanneer je grote emails opent.

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

IMHO --->

Een geheugenlek in Java, dat is toch een hele prestatie :+

I'm always thinking one step ahead, like a carpenter - who makes stairs

quote:
TRRoads schreef op vrijdag 31 augustus 2007 @ 20:11:
Een geheugenlek in Java, dat is toch een hele prestatie :+
De JVM gaat pas geheugen opruimen als het de limiet van het beschikbare geheugen nadert (of wanneer het zich te pletter verveelt).
Het kan dus zijn dat de JVM zich nergens druk over maakt omdat er nog 100 MB vrij geheugen is. Als je dan vervolgens een instantie aanmaakt wat 200 MB nodig heeft dan kan het best misgaan.

The_Tzar wijzigde dit bericht 31-08-2007 20:15 (4%)

-- SoftwareSystems the_Tzar(Coffee coffee){ //the only method you need... -- specs workstation

quote:
TRRoads schreef op vrijdag 31 augustus 2007 @ 20:11:
Een geheugenlek in Java, dat is toch een hele prestatie :+
Niet zo moeilijk, gewoon een kwestie van (globale) referenties niet op null zetten :). Dat kan ingewikkelder zijn dan het klinkt, andere systemen (zoals de GUI) kunnen ook indirect referenties hebben naar jouw objecten, en dan worden die dingen dus nooit opgeruimd.
quote:
gorgi_19 schreef op vrijdag 31 augustus 2007 @ 11:30:
iif stamt nog uit de oude VB6 tijd;
iif (immediate if) stamt voor zover ik weet van nog veel verder terug. Clipper Autumn '86 had 't al, net als FoxBase 2.0. En 't zou me niet verbazen dat er voor die tijd ook wel andere talen waren die die constructie kenden. ;)

"Bonken op de muur helpt niet, een goedgericht nekschot wel" - Sjaak Bral

quote:
Grijze Vos schreef op vrijdag 31 augustus 2007 @ 12:21:
Ik meen me te herinneren dat Object Pascal (Delphi) ook een cand en cor had voor shortcircuiting. Kan zijn dat in nieuwere versies dit standaard is geworden.
Shortcircuiting is bij Delphi al vanaf versie 1 default, maar kan nu nog steeds met een compiler directive uitgezet worden. Waarom je dat overigens ooit zou willen is een 2e... ;)

"Bonken op de muur helpt niet, een goedgericht nekschot wel" - Sjaak Bral



© 1998-2008 Tweakers.net BV - Based on React - Hosted by True - Served by Aphaea

© 1998-2008 Tweakers.net BV - Based on React - Hosted by True - Served by Aphaea

[RSS][XML]

Update Tracker

Active Topics
Active Topics
Frontpage Nieuws
Frontpage Nieuws