Ho un certo numero di server dati che stanno trasferendo dati su un server principale come in questo tipo di architettura:
Questipuntidati(points
inbreve)vengonoaggiornaticasualmentedaciascunserver.Sulservercisonoaltripuntidatidefinitidall'utente(chiamatiTags
)chesonoespressionibasatesuunoopiùpoints
.IlserverhapotenzialmentecentinaiadimigliaiadiquestiTags
.
Adesempio:
Points={DataPointA,DataPointB,DataPointC}Tags={DataPointA*1.8+32,DataPointA*DataPointC/2,DataPointC*DataPointC}
Ilback-enddelserverèscrittoinC#ehodecisodiusareJavaScriptperconsentireall'utentedidefinireleespressionichecostituisconoivaloridiTag
(principalmenteperchél'altrapartediquestoèunavisualizzazionebasatasulwebevogliosolounlinguaggiodiscripting).
problema
NondesiderocreareunsingolomotoreJavaScriptperogniTag
poichéciòrichiederebbeunusointensivodellamemoria.HoselezionatoJIntperilmotoreJavaScript(deveesseremono-compatibileinmodocheV8siafuori)epossocrearevariabili(Tags
)eassegnarevalori(Points
)manonthread-safe.QuindidovreiaspettarefinoalcompletamentodiunTag
primadiiniziarneunaltro.Questoèuncollodibottigliadelleprestazioni.
Quindihopensatodicreareunpooldimotoriepassareimotorinonappenasonodisponibili,ilTag
lobloccamentreloutilizzaepoilorilasciaquandoèfinito.Nonsonosicurochequestosial'approcciomiglioreperchéduranteimieitesthoriscontratocheilsingolomotoreècircail25%piùveloce(oforseèlamiaimplementazione).
Comeaffronterestiquestoproblema?Nonèpossibiledelegareicalcoliaiserverdidatiperchéleespressionipossonoutilizzaretagdapiùservereciòrichiederebbecheiserversiparlinoreciprocamenteounoscambiobidirezionaleconunrepositorysulserverprincipale.
Eccoalcunicodicisedesideriguardarciattraverso:
Esempio minimo con requisito JInt
Nota sul codice: qui c'è un livello di riferimento indiretto con l'uso di Variable
, questo perché i "nomi" del punto di dati sono in realtà GUID e un GUID non lo rende un nome di variabile valido (o valido), quindi devono essere sottoposti a aliasing in qualcosa che è un nome di variabile valido.