eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingSkładnia pętli (ogólnie i filozoficznie)
Ilość wypowiedzi w tym wątku: 4

  • 1. Data: 2012-03-17 12:01:02
    Temat: Składnia pętli (ogólnie i filozoficznie)
    Od: "slawek" <s...@h...pl>

    Czy jest jakiś ładny sposób zapisu if-wewnątrz-for (ew. innych pętli)
    takich, że jest GWARANTOWANE przeniesienie if przed for w wyniku kompilacji,
    tak aby test if wykonywał się tylko jeden raz - a nie np. 10 milionów razy -
    i to bez sięgania po optymalizację?

    Jeżeli jest coś takiego for{ if } -- czyli instrukcja warunkowa wewnątrz
    pętli, np.:

    for (i = 0; i < 10; i++)
    if(x > y)
    {
    ...a...
    ...b1...
    ...c...
    ...d...
    ...e1...
    ...f...
    }
    else
    {
    ...a...
    ...b2...
    ...c...
    ...d...
    ...e2...
    ...f...
    }

    Oczywiście kumaty kompilator (x i y są ustalone z zewnątrz) powinien to
    sobie zoptymalizować do

    if
    {
    for
    for
    }

    Ale jak to zapisać bez potrzeby odwoływania się do mądrości kompilatora i
    bez rozwlekania jak niżej?

    if(a > b)
    for (i = 0; i < 10; i++)
    {
    ...a...
    ...b1...
    ...c...
    ...d...
    ...e1...
    ...f...
    }
    else
    for (i = 0; i < 10; i++)
    {
    ...a...
    ...b2...
    ...c...
    ...d...
    ...e2...
    ...f...
    }

    W kodzie źródłowym niepotrzebne są dublowane linie ...a... ...c... ...d...
    ...f..., co jest nieprzyjemne jeżeli jest ich za mało aby robić z nich
    procedurę (i nie chcemy mieć narzutów na call/ret - no, ale to też powinien
    zoptymalizować kompilator) - a jednocześnie MUSZĄ one być dokładnie takie
    same (i np. poprawka w jednym miejscu pociąga za sobą poprawianie w tuzinie
    podobnych.







  • 2. Data: 2012-03-17 13:01:53
    Temat: Re: Składnia pętli (ogólnie i filozoficznie)
    Od: bartek szurgot <b...@n...spam>

    On 03/17/2012 01:01 PM, slawek wrote:
    > Czy jest jakiś ładny sposób zapisu if-wewnątrz-for (ew. innych pętli)
    > takich, że jest GWARANTOWANE przeniesienie if przed for w wyniku
    > kompilacji, tak aby test if wykonywał się tylko jeden raz - a nie np. 10
    > milionów razy - i to bez sięgania po optymalizację?
    >
    > Jeżeli jest coś takiego for{ if } -- czyli instrukcja warunkowa
    > wewnątrz pętli, np.:
    >
    > for (i = 0; i < 10; i++)
    > if(x > y)
    > {
    > ...a...
    > ...b1...
    > ...c...
    > ...d...
    > ...e1...
    > ...f...
    > }
    > else
    > {
    > ...a...
    > ...b2...
    > ...c...
    > ...d...
    > ...e2...
    > ...f...
    > }
    >
    > Oczywiście kumaty kompilator (x i y są ustalone z zewnątrz) powinien to
    > sobie zoptymalizować do
    >
    > if
    > {
    > for
    > for
    > }
    >
    > Ale jak to zapisać bez potrzeby odwoływania się do mądrości kompilatora
    > i bez rozwlekania jak niżej?
    >
    > if(a > b)
    > for (i = 0; i < 10; i++)
    > {
    > ...a...
    > ...b1...
    > ...c...
    > ...d...
    > ...e1...
    > ...f...
    > }
    > else
    > for (i = 0; i < 10; i++)
    > {
    > ...a...
    > ...b2...
    > ...c...
    > ...d...
    > ...e2...
    > ...f...
    > }
    >
    > W kodzie źródłowym niepotrzebne są dublowane linie ...a... ...c...
    > ...d... ...f..., co jest nieprzyjemne jeżeli jest ich za mało aby robić
    > z nich procedurę (i nie chcemy mieć narzutów na call/ret - no, ale to
    > też powinien zoptymalizować kompilator) - a jednocześnie MUSZĄ one być
    > dokładnie takie same (i np. poprawka w jednym miejscu pociąga za sobą
    > poprawianie w tuzinie podobnych.


    poczytaj o metaprogramowaniu. w połączeniu ze wzorcem strategii, będzie
    to to, czego szukasz.

    --
    pozdrawiam serdecznie / best regards,
    bartek szurgot
    /* http://www.baszerr.org */


  • 3. Data: 2012-03-17 16:19:18
    Temat: Re: Składnia pętli (ogólnie i filozoficznie)
    Od: Roman W <b...@g...pl>

    On Saturday, March 17, 2012 1:01:53 PM UTC, bartek szurgot wrote:
    > On 03/17/2012 01:01 PM, slawek wrote:
    > > Czy jest jakiś ładny sposób zapisu if-wewnątrz-for (ew. innych pętli)
    > > takich, że jest GWARANTOWANE przeniesienie if przed for w wyniku
    > > kompilacji, tak aby test if wykonywał się tylko jeden raz - a nie np. 10
    > > milionów razy - i to bez sięgania po optymalizację?
    > >
    > > Jeżeli jest coś takiego for{ if } -- czyli instrukcja warunkowa
    > > wewnątrz pętli, np.:
    > >
    > > for (i = 0; i < 10; i++)
    > > if(x > y)
    > > {
    > > ...a...
    > > ...b1...
    > > ...c...
    > > ...d...
    > > ...e1...
    > > ...f...
    > > }
    > > else
    > > {
    > > ...a...
    > > ...b2...
    > > ...c...
    > > ...d...
    > > ...e2...
    > > ...f...
    > > }
    > >
    > > Oczywiście kumaty kompilator (x i y są ustalone z zewnątrz) powinien to
    > > sobie zoptymalizować do
    > >
    > > if
    > > {
    > > for
    > > for
    > > }
    > >
    > > Ale jak to zapisać bez potrzeby odwoływania się do mądrości kompilatora
    > > i bez rozwlekania jak niżej?
    > >
    > > if(a > b)
    > > for (i = 0; i < 10; i++)
    > > {
    > > ...a...
    > > ...b1...
    > > ...c...
    > > ...d...
    > > ...e1...
    > > ...f...
    > > }
    > > else
    > > for (i = 0; i < 10; i++)
    > > {
    > > ...a...
    > > ...b2...
    > > ...c...
    > > ...d...
    > > ...e2...
    > > ...f...
    > > }
    > >
    > > W kodzie źródłowym niepotrzebne są dublowane linie ...a... ...c...
    > > ...d... ...f..., co jest nieprzyjemne jeżeli jest ich za mało aby robić
    > > z nich procedurę (i nie chcemy mieć narzutów na call/ret - no, ale to
    > > też powinien zoptymalizować kompilator) - a jednocześnie MUSZĄ one być
    > > dokładnie takie same (i np. poprawka w jednym miejscu pociąga za sobą
    > > poprawianie w tuzinie podobnych.
    >
    >
    > poczytaj o metaprogramowaniu. w połączeniu ze wzorcem strategii, będzie
    > to to, czego szukasz.

    Tez bym tak zrobil, w polaczeniu z funckjami lambda z C++ 0x moze to byc ladne i
    eleganckie rozwiazanie. Ale wtedy nadal bedzie mial narzut na wolanie funkcji, jezeli
    kompilator nie zdecyduje sie na inlining funkcji (nie musi).

    Jezeli to jest NAPRAWDE koniecznie zeby uniknac wolania funkcji, to pozostaja makra
    preprocesora.

    RW


  • 4. Data: 2012-03-17 21:34:56
    Temat: Re: Składnia pętli (ogólnie i filozoficznie)
    Od: "slawek" <s...@h...pl>


    Użytkownik "Roman W" <b...@g...pl> napisał w wiadomości grup
    dyskusyjnych:3360685.2549.1332001158521.JavaMail.geo
    -discussion-forums@vbbfw10...
    >> poczytaj o metaprogramowaniu. w połączeniu ze wzorcem strategii, będzie
    >> to to, czego szukasz.
    >
    > Tez bym tak zrobil, w polaczeniu z funckjami lambda z C++ 0x moze to byc
    > ladne i eleganckie rozwiazanie. Ale wtedy nadal bedzie mial narzut na
    > wolanie funkcji, jezeli kompilator nie zdecyduje sie na inlining funkcji
    > (nie musi).
    >
    > Jezeli to jest NAPRAWDE koniecznie zeby uniknac wolania funkcji, to
    > pozostaja makra preprocesora.

    Makra i include to rozwiązania połowiczne. I jeszcze kwestia kontekstu -
    chodzi o szybkość - czyli zero narzutów na cokolwiek.

    Oczywiście można tak:

    $$for ( ... )
    {
    ...a...
    $$if (cond)
    {
    ...b1...
    }
    $$else
    {
    ...b2...
    }
    ...c...
    }

    i potem przepuścić to przez skrypt awk jako przez preprocesor, aby
    wygenerować to co trzeba, tj. if{for for} zamiast for{if}. I jeszcze na
    wiele innych sposobów.

    Ale!

    Po pierwsze: to już nie jest w danym Języku - tzn. nie jest to już
    Ada/Algol/cokolwiek - tylko w zasadzie "zupełnie nowy język" (dialekt?)

    Po drugie: skoro to jest już "zupełnie nowy język" - to przecież tego
    rodzaju "cuś" MOŻE BYĆ elementem języka. Czyli teoretycznie można
    wprowadzić. Dlaczego wobec tego nie wprowadzono... skoro: a. upraszcza; b.
    zabezpiecza; c. przyspiesza. Czyli ma same zalety?!


strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: