Μέτρηση απόδοσης και στενά σημεία — DedSec Project
Μετρήσεις απόδοσης — πρώτα ορθότητα, μετά ταχύτητα Σενάριο και κριτήρια επιτυχίας Σύγκρινε αναζήτηση συμμετοχής σε σταθερό δείγμα με 400 διαθέσιμες ετικέτες και 80 ζητούμενες. Οι δύο…
Μετρήσεις απόδοσης — πρώτα ορθότητα, μετά ταχύτητα
Σενάριο και κριτήρια επιτυχίας
Σύγκρινε αναζήτηση συμμετοχής σε σταθερό δείγμα με 400 διαθέσιμες ετικέτες και 80 ζητούμενες. Οι δύο υλοποιήσεις πρέπει να επιστρέφουν ακριβώς την ίδια σειρά αποτελεσμάτων, συμπεριλαμβανομένων επαναλήψεων. Κάνε πολλές μετρήσεις με χρονόμετρο υψηλής ανάλυσης, εμφάνισε τη διάμεσο και μέτρησε την κορυφή δεσμεύσεων μνήμης μέσω tracemalloc. Δεν πρέπει να θεωρείς εκ των προτέρων ότι μία λύση είναι πάντα ταχύτερη.
Εκτελέσιμο εργαστήριο
Αποθήκευσε ως 16_perf.py και εκτέλεσε με Python 3 και την ενσωματωμένη βιβλιοθήκη. Τα δεδομένα είναι τεχνητά, χωρίς πρόσβαση σε προσωπικά αρχεία ή δίκτυο.
from statistics import median
from time import perf_counter
from tracemalloc import start, stop, get_traced_memory
def linear(labels, wanted):
return [name for name in wanted if name in labels]
def indexed(labels, wanted):
keys = set(labels)
return [name for name in wanted if name in keys]
labels = [f"k{i:04d}" for i in range(400)]
wanted = ["k0000","k0399","absent","k0000"] * 20
assert linear(labels, wanted) == indexed(labels, wanted)
def bench(fn, repetitions=7):
samples=[]
for _ in range(repetitions):
t0=perf_counter()
result=fn(labels,wanted)
samples.append(perf_counter()-t0)
assert result == linear(labels,wanted)
return median(samples)
start()
before=get_traced_memory()[1]
linear_time=bench(linear)
indexed_time=bench(indexed)
peak=get_traced_memory()[1]-before
stop()
assert linear_time >= 0 and indexed_time >= 0
print("PASS representative result; median seconds:",
round(linear_time,6),round(indexed_time,6),"peak delta:",peak)
Τεχνική ερμηνεία
Η ασυμπτωτική πολυπλοκότητα περιγράφει την τάση αύξησης, όχι τις σταθερές, την κατανομή χρόνου της CPU ή το κόστος μνήμης. Ένα set χρειάζεται προετοιμασία και πρόσθετη μνήμη, που μπορεί να μην αξίζουν για λίγες αναζητήσεις. Ο μηχανισμός μέτρησης επηρεάζει και ο ίδιος τη διάρκεια. Κράτησε σταθερά τα δεδομένα και έλεγξε την ισότητα αποτελεσμάτων πριν συγκρίνεις χρόνους. Η tracemalloc βλέπει κυρίως δεσμεύσεις Python και όχι απαραίτητα όλη τη μνήμη της διεργασίας ή την υπερθέρμανση της συσκευής.
Περιορισμένες δοκιμές
Άλλαξε το πλήθος διαθέσιμων ετικετών από 20 έως 20.000 κρατώντας σταθερά τα ζητούμενα. Δοκίμασε δέκα αναζητήσεις στο ίδιο έτοιμο σύνολο και μέτρησε χωριστά την κατασκευή του. Κράτησε επτά χρόνους ανά υλοποίηση και σύγκρινε διάμεσο και διακύμανση. Σε κινητό σημείωσε έκδοση Python και, αν είναι διαθέσιμη, τη θερμοκρασία συσκευής.
Διάγνωση
Αν διαφέρουν οι έξοδοι, διόρθωσε πρώτα τη λογική και μετά μέτρησε χρόνο. Αν υπάρχουν μεγάλες αποκλίσεις, επανάλαβε σε πιο ήσυχο περιβάλλον και εξέτασε τη συλλογή απορριμμάτων. Μην γράφεις αυστηρά όρια μικροδευτερολέπτων ως καθολικούς ελέγχους.