[zxspectrum] Re: Quel brav'uomo del dottor Kendall...

  • From: Enrico Maria Giordano <e.m.giordano@xxxxxxxxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Tue, 25 Jan 2005 00:23:32 +0100


Luca Bisti wrote:
> 
> RealX e' completamente strutturato ad oggetti, con un discreto uso delle
> caratteristiche del C++ e quindi qualcosa devo effettivamente pagare. Ad
> esempio abbiamo una classe astratta DEVICE che definisce l'interfaccia di
> programmazione standard dei vari dispositivi emulati; la DISCiPLE e'
> implementata semplicemente derivando una classe da DEVICE ed implementando
> opportunamente i vari metodi richiesti. Non solo, uno sviluppatore esterno
> puo' fare altrettanto (con un semplice SDK da noi fornito, sostanzialmente
> un file di include) e puo' scriversi la libreria OPUS.DLL che una volta
> posta nella directory di RealX aggiunge automaticamente il supporto Opus
> Discovery a RealX.

Fantastico!

> Il problema dell'efficienza del C++ ce lo siamo invece posto nel caso dei
> sistemi che fanno parte del loop principale dell'emulazione, primo fra
> tutti il core Z80.
> Considera infatti che RealX deve emulare sistemi con piu' di uno Z80, ad
> esempio quando c'e' di mezzo il General Sound e l'FDD3000. Per vari motivi
> vogliamo usare una classe Z80 da istanziare quante volte vogliamo, ma
> ovviamente se si dichiarano i registri come variabili della classe allora
> ci sara' di mezzo un'indirezione di memoria in piu' dovuta al puntatore
> this ogni volta che accedo ad un registro dentro le routines di emulazione.

Per curiosità ho scritto questo piccolo test (francamente non so quanto
significativo):

#include <iostream>
#include <ctime>


int SenzaThis = 0;


class Test
{
    public:
        Test():ConThis( 0 ){}
        int ConThis;
};


int main()
{
    const int QuantiI = 100000;
    const int QuantiJ = 10000;

    std::clock_t start, end;

    start = std::clock();

    for ( int i = 0; i < QuantiI; ++i )
        for ( int j = 0; j < QuantiJ; ++j )
            SenzaThis *= 2;

    end = std::clock();

    std::cout << SenzaThis << '\n';

    std::cout << "SenzaThis - Ticks impiegati: " << ( end - start ) <<
'\n';

    Test t;

    start = std::clock();

    for ( int i = 0; i < QuantiI; ++i )
        for ( int j = 0; j < QuantiJ; ++j )
            t.ConThis *= 2;

    end = std::clock();

    std::cout << t.ConThis << '\n';

    std::cout << "ConThis - Ticks impiegati: " << ( end - start ) <<
'\n';

    return 0;
}

E questi sono i risultati:

DJGPP:
SenzaThis - Ticks impiegati: 260
ConThis - Ticks impiegati: 265

BCC55
SenzaThis - Ticks impiegati: 7330
ConThis - Ticks impiegati: 6810

MSVC++2003
SenzaThis - Ticks impiegati: 2964
ConThis - Ticks impiegati: 2924

Si possono trarre, con le dovute precauzioni, almeno due conclusioni:
che la differenza non è poi così elevata (mi sembra sia ben al di sotto
del 10% anche nel caso peggiore) e che varia molto a seconda del
compilatore utilizzato (come si vede può anche cambiare di segno!).
Immagino abbiate sottoposto il vostro codice ad un profiler, giusto?
Spesso ci si inganna sulla reale natura del collo di bottiglia.

EMG

--
EMAG Software Homepage:     http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: http://www.emagsoftware.it/tbosg

Other related posts: