dati StableName unQuali sono i vantaggi di StableNames rispetto a reallyUnsafePtrEquality # e viceversa?
nomi stabili hanno la seguente proprietà: Se sn1 :: StableName e SN2 :: StableName e sn1 == SN2 poi sn1 e SN2 sono stati creati da chiamate verso makeStableName sullo stesso oggetto.
L'inverso non è necessariamente vero: se due nomi stabili non sono uguali, gli oggetti che chiamano possono essere uguali.
reallyUnsafePtrEquality# :: a -> a -> Int #
reallyUnsafePtrEquality # restituisce se due oggetti sul mucchio GHC sono lo stesso oggetto. È davvero pericoloso perché il garbage collector sposta le cose intorno, chiusure, ecc. Per quanto ne so, può restituire falsi negativi (dice che due oggetti non sono gli stessi, ma lo sono), ma non i falsi positivi (dicendo che Sono uguali quando non lo sono).
Entrambi sembrano fare la stessa cosa di base: possono dirti se due oggetti sono sicuramente gli stessi, ma non se lo sono sicuramente.
I vantaggi che posso vedere per StableNames sono:
- Possono essere hash.
- Sono meno non portabili.
- Il loro comportamento è ben definito e supportato.
- Non hanno davvero sicuro come parte del loro nome.
I vantaggi che posso vedere per reallyUnsafePtrEquality #:
- può essere chiamato direttamente sugli oggetti in questione, invece di dover creare StablesNames separati.
- Non è necessario passare attraverso una funzione IO per creare nomi stabili.
- Non è necessario mantenere StableNames in giro, quindi l'utilizzo della memoria è inferiore.
- L'RTS non deve fare alcuna magia per far funzionare gli StableNames, quindi le prestazioni sono presumibilmente migliori.
- Ha davvero un sicuro nel nome e un # alla fine. Hardcore!
Le mie domande sono:
Mi sono perso qualcosa?
C'è qualche caso d'uso in cui il fatto che StableNames siano separati dagli oggetti che nominano è un vantaggio?
È uno più preciso (meno probabile che restituisca i falsi negativi) rispetto all'altro?
Se non hai bisogno dell'hashing, non ti preoccupare della portabilità e non ti preoccupare di usare qualcosa chiamato veramente Unsafe, c'è qualche motivo per preferire StableNames su reallyUnsafePtrEquality #?
"Per quanto ne so, può restituire falsi negativi (si dice che due oggetti non sono gli stessi, ma lo sono), ma non i falsi positivi (dicendo che sono gli stessi quando non lo sono). " Ho paura [può dare falsi positivi] (http://www.haskell.org/pipermail/haskell-cafe/2010-June/079532.html), anche se questo è estremamente improbabile. –
Non riesco a ricordare dove è stato discusso (potrebbe essere stato IRC), ma i due motivi per cui ricordo perché i falsi positivi sono impossibili erano che il GC si verifica solo a allocazione, non durante i primops, quindi non c'è modo possibile interrompi veramenteUnsafePtrEquality # per mettere un oggetto dove era l'altro; e che i GC dallo spazio-spazio allo spazio non si sovrappongono, quindi anche se potesse, non lo farebbe. Ovviamente se fossero possibili sia i falsi negativi che i falsi positivi sarebbe completamente inutile. – glaebhoerl
Sembra plausibile. Ma di solito Edward K. sa cosa succede, quindi preferirei ricontrollare che ignorare allegramente i suoi avvertimenti. Tuttavia, il secondo punto esclude quasi tutti i falsi positivi (due GC tra l'osservazione dei due argomenti per un primop sembra un po 'troppo inverosimile), anche se uno non si fida completamente del primo. –