Ho un certo numero di server dati che stanno trasferendo dati su un server principale come in questo tipo di architettura:

Questipuntidati(pointsinbreve)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
NondesiderocreareunsingolomotoreJavaScriptperogniTagpoichéciòrichiederebbeunusointensivodellamemoria.HoselezionatoJIntperilmotoreJavaScript(deveesseremono-compatibileinmodocheV8siafuori)epossocrearevariabili(Tags)eassegnarevalori(Points)manonthread-safe.QuindidovreiaspettarefinoalcompletamentodiunTagprimadiiniziarneunaltro.Questoèuncollodibottigliadelleprestazioni.
Quindihopensatodicreareunpooldimotoriepassareimotorinonappenasonodisponibili,ilTaglobloccamentreloutilizzaepoilorilasciaquandoè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.