Dipende molto da cosa pensi di fare con la struttura dei dati. Se finirai col riempirlo con un determinato input strutturato, dovresti anche testarlo in questo modo.
Se non sai nulla dei tuoi futuri input e vuoi misurare le prestazioni medie, ricorda che la teoria della complessità calcola le prestazioni medie basate su input randomizzati (usando una distribuzione normale). Quindi, il test delle prestazioni nel caso medio dovrebbe includere molte esecuzioni con input casuali diversi.
A seconda delle strutture dati stesse, potresti anche essere interessato a confrontare determinate strutture di input che sono note per essere molto buone / cattive per una delle strutture dati. Tuttavia, la tua futura applicazione della struttura dati potrebbe quasi mai creare tali input, nel qual caso potresti ben ignorare il confronto delle prestazioni di questi casi. (Esempio intuitivo: confrontando gli algoritmi di ordinamento in un contesto, in cui si tenta spesso di ordinare una sequenza già ordinata, è possibile che vengano lanciate molte implementazioni Quicksort.)
Per quanto riguarda il tuo punto di ottimizzazione, la risposta è di nuovo: dipende. Hai intenzione di utilizzare questa struttura dati esattamente in quel preciso progetto in questo momento? Quindi andrei per le versioni ottimizzate. Stai mirando a un confronto per avere un'idea generale su quale potrebbe essere più adatto per un progetto pianificato? Quindi prova a confrontare le implementazioni di riferimento, ma non perdere tempo a creare implementazioni super-efficienti. Naturalmente, il contesto in cui si eseguono i test deve essere comparabile, quindi non provare a f.ex. confrontare tra loro le implementazioni in diversi linguaggi di programmazione. Probabilmente ovvio, ma ho pensato di assicurarmi di menzionarlo.