Spese generali per l'OLP

 

In relazione a un compito ad alta intensità di risorse, è sorta una domanda - qual è l'overhead dell'uso di OOP rispetto alla programmazione procedurale convenzionale.

Qualcuno ha fatto questi test?

Sono interessato alla differenza tra:

  1. Chiamata di funzione con parametri
  2. Chiamata di funzione senza parametri
  3. Chiamata macro con funzionalità della funzione precedente
  4. Chiamata di funzione - metodo di una classe
  5. Chiamata di funzione virtuale

 

Di che tipo di spese generali stiamo parlando?

Se stiamo parlando di codice macchina, allora, per quanto ne so, la funzione virtuale chiama la procedura indirettamente, attraverso la tabella delle funzioni virtuali. E nel caso di funzioni normali è una chiamata diretta. Penso che ci siano poche spese generali.

L'overhead del programmatore è molto più importante - scrittura e manutenzione del codice, correzione di bug...

 

Le funzioni senza parametri sono più veloci delle funzioni con parametri.

 
Dmitry Fedoseev:

Le funzioni senza parametri sono più veloci delle funzioni con parametri.


Certo, mi sono sbattuto in assembler per 2 anni )) Vero, per i processori embedded, ma C++ è sempre C++. Anche una funzione senza parametri ha un prologo e un epilogo, che richiede tempo.

Il modo più veloce, ovviamente, è usare una macro progettata per sembrare una funzione. È un peccato che non ci siano funzioni in linea in MQL, ma le macro sono un sostituto per

 
George Merts:

Di che tipo di spese generali stiamo parlando?

Se stiamo parlando di codice macchina, allora, per quanto ne so, la funzione virtuale chiama la procedura indirettamente, attraverso la tabella delle funzioni virtuali. E nel caso di funzioni normali è una chiamata diretta. Penso che ci siano poche spese generali.

L'overhead del programmatore è molto più importante - scrittura e manutenzione del codice, correzione degli errori...


Naturalmente, non ci interessa l'overhead del tempo di esecuzione - quei kilobyte extra non contano. Non ci importa di quei kilobyte in più.

 

Una macro sarebbe ovviamente la più veloce.

 
Alexey Volchanskiy:

Il modo più veloce è ovviamente una macro progettata come una funzione. Peccato, MQL non ha funzioni in linea, ma una macro sarebbe un sostituto

Rinat ha detto che MT ha una seria funzione in linea, e dà buoni risultati.

 
George Merts:

Rinat ha detto che MT - un serio inliner funziona, e dà buoni risultati.


Sì, secondo le mie osservazioni personali, in MT4 il lavoro dell'inliner dipende dalla dimensione dello stack (memoria allocata per le variabili nello stack) e dal numero di variabili.
Ma in MT5 la dipendenza dalla dimensione dello stack sembra essere rimossa e l'ottimizzatore è più assistente in generale.

 
Alexey Volchanskiy:

In relazione a un compito ad alta intensità di risorse, è sorta una domanda - qual è l'overhead dell'uso di OOP rispetto alla programmazione procedurale convenzionale.

Qualcuno ha fatto questi test?

Sono interessato alla differenza tra:

  1. Chiamata di funzione con parametri
  2. Chiamata di funzione senza parametri
  3. Chiamata di una macro con la funzionalità della funzione precedente
  4. Chiamata di funzione - metodo di una classe
  5. Chiamata di funzione virtuale

Se sono disponibili librerie OOP pronte all'uso, questo riduce il tempo di sviluppo dell'applicazione. La velocità di esecuzione può rallentare quando si chiama la funzione virtuale.

L'unica sfumatura è la disponibilità di buone librerie OOP.

"Libreria standard" viola il mio senso della bellezza e mi fa andare su DLL e codificare tranquillamente in C++


 
George Merts:

Rinat ha detto che in MT - un inliner serio funziona, e dà buoni risultati.

Sì, l'inliner è molto aggressivo e automatico.

L'ottimizzatore x64 è anche una testa sopra la versione 32bit (questo ramo è completamente fermo e non sviluppato). Inoltre, l'ottimizzatore x64 sa come srotolare la maggior parte delle funzioni virtuali in chiamate dirette e inline. Dopo tutto, le funzioni virtuali sono spesso degenerate.

Ma dove il vero overhead è nelle operazioni di riferimento e nel controllo degli indici dinamici. Devono essere sempre controllati.

 
Alexey Volchanskiy:

In relazione a un compito ad alta intensità di risorse, è sorta una domanda - qual è l'overhead dell'uso di OOP rispetto alla programmazione procedurale convenzionale.

Naturalmente, le belle caratteristiche di OOP sono costose in termini di risorse e di tempo per il debug. OOP ha senso solo come un comodo involucro di testo o in caso di uso minimo all'inizializzazione di runtime... In realtà, OOP era solo una cosa di marketing di Microsoft per aumentare i costi delle ore di lavoro dei programmatori e per stimolare l'acquisto di attrezzature più avanzate. E loro stessi non sono stupidi e scrivono tutto il software in C e assembler.

Motivazione: