Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C++] Velocità di alcune operazioni

    Devo elaborare un file immagine .pixmap e vorrei anche utilizzare immagini medio grandi. Il programma sarà più veloce se uso array di char, se uso stringhe con le relative funzioni oppure è uguale?
    A rigor di logica, essendo le stringhe degli array di char, dovrebbe essere identico il tempo, ma vorrei una conferma.

  2. #2

    Re: [C++] Velocità di alcune operazioni

    Originariamente inviato da il_dordollano
    Devo elaborare un file immagine .pixmap e vorrei anche utilizzare immagini medio grandi. Il programma sarà più veloce se uso array di char, se uso stringhe con le relative funzioni oppure è uguale?
    A rigor di logica, essendo le stringhe degli array di char, dovrebbe essere identico il tempo, ma vorrei una conferma.
    Premetto che non sono un programmatore esperto, ma a mio avviso se cerchi l'efficienza la cosa migliore é utilizzare le funzioni della libreria standard. A naso ti direi di utilizzare un std::vector e di lavorarci sopra con gli iteratori e gli algoritmi della libreria standard.
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Se cerchi la pura velocità ti conviene un array di byte (o unsigned char) da te gestito, però perdi molto in mantenibilità e gestibilità del codice.
    Ti conviene conservare quest'ultima piuttosto di guadagnare un po' di velocità anche perchè rischi di trovarti con un codice ingestibile e pieno di bug.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Se il tuo problema è la velocita' e lavori su sistemi multiprocessore sfrutta quest'ultima a scapito dell'array di bytes.
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Ti conviene conservare quest'ultima piuttosto di guadagnare un po' di velocità anche perchè rischi di trovarti con un codice ingestibile e pieno di bug.
    Se il tuo problema è la velocita' e lavori su sistemi multiprocessore sfrutta quest'ultima a scapito dell'array di bytes.
    Vi rigrazio, ma mi state dicendo: "L'array di bytes è veloce ma non usarlo". Io mi trovo da punto a capo, non so nemmeno usare gli array di bytes.

    è più o meno veloce operare con string in confronto a un array di char?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Un array di char (più precisamente unsigned char, ma lo è di default) è equivalente ad un array di byte ed è più veloce di una string, ma introduce molte più complicazioni che possono intrudurre bug e far si che il codice, se mal strutturato, risulti più lento di uno con un più alto livello di astrazioni.
    A parte che sarebbe più logico l'uso di vector che di string, o comunque di altre strutture...
    String è per l'elaborazione di stringhe di testo...

    In sostanza: in assoluto un array di char è più veloce ma in realtà la scelta va valutata più cautamente.

    Altra possibile soluzione è la parallelizzazione, come ti è stato suggerito, la quale però introduce altre complicazioni.

    Dipende dai casi, comunque a mio parere la scelta più corretta sarebbe implementare classi con un'alto livello di astrazione e codice ottimizzato all'interno (in modo che, una volta implementato e testato per bene il codice interno, l'uso risulti facile e sicuro) in abbinamento a una buona parallelizzazione (es: elaborazione indipendente di più righe o sezioni dell'immagine)

    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    In sostanza: in assoluto un array di char è più veloce ma in realtà la scelta va valutata più cautamente
    Questa è una sciocchezza: dato che una std::string o un std::vector<char> non sono altro che un array di char allocato sull'heap e incapsulato in una classe, l'accesso ai bytes è veloce esattamente come per gli array di char, dato che tutti i metodi di accesso vengono espansi inline (se si compila con le ottimizzazioni attive), e i controlli sugli indici sono attivi solo se lo chiedi (usando at() invece dell'operatore []).

    Inoltre, a differenza degli array di char, hai a disposizione un sacco di metodi comodi, la gestione automatica della memoria, una semantica di copia ben definita e un sacco di altre comodità.

    Il mio consiglio quindi è di usare assolutamente un std::vector<unsigned char>; unsigned non è strettamente necessario, ma è pratica comune usare degli unsigned char per dati binari, in genere ti consentono di risparmiare qualche cast qua e là nel codice.
    Eviterei std::string non per motivi di performance, ma perché dà a chi legge il codice l'impressione che si stia lavorando con del testo, quando in realtà si tratta di dati binari.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8

    Re: [C++] Velocità di alcune operazioni

    Originariamente inviato da il_dordollano
    Devo elaborare un file immagine .pixmap e vorrei anche utilizzare immagini medio grandi. Il programma sarà più veloce se uso array di char, se uso stringhe con le relative funzioni oppure è uguale?
    A rigor di logica, essendo le stringhe degli array di char, dovrebbe essere identico il tempo, ma vorrei una conferma.
    Ti consiglio di usare un tipo adatto (sicuro che char lo sia?) e di usare comunque i contenitori della libreria standard, i quali contengono già delle ottimizzazioni in base al tipo di dato che devono contenere.
    Incapsula il tutto in una classe concreta in modo da disaccoppiare il contenitore dalla logica del tuo programma, così potrai testare diversi contenitori senza dover metter mano all'intero progetto.
    ...

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da MItaly
    Inoltre, a differenza degli array di char, hai a disposizione un sacco di metodi comodi, la gestione automatica della memoria, una semantica di copia ben definita e un sacco di altre comodità.
    E' appunto sulla gestione della memoria che puoi fare ottimizzazioni, almeno in questo caso è il punto di maggiore ottimizzazione (l'unico).

    In ogni caso il guadagno in velocità non sarebbe poi così rilevante e avresti una perdita in astrazione e gestibilità del codice (che è quello che mi ostino a ripetere).

    Originariamente inviato da Caiodark
    Ti consiglio di usare un tipo adatto (sicuro che char lo sia?)
    Char è l'unico tipo standard di 1 byte, unsigned char cambia solo il segno...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Originariamente inviato da Scara95
    E' appunto sulla gestione della memoria che puoi fare ottimizzazioni, almeno in questo caso è il punto di maggiore ottimizzazione (l'unico).
    Un'immagine non può che essere allocata sull'heap (a meno che non sia veramente piccola) ed è di dimensioni fissate, per cui non è che ci sia tutta questa scelta nelle strategie di allocazione... in ogni caso tutti i container STL supportano come argomento template un oggetto allocatore custom.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.