Jump to content

Recommended Posts

před 32 minutami, xhunterx said:

To je celkom rozsireny mytus. V sampe nieje problem adresovat akukolvek pamat celeho procesu, ak si ochotny pouzivat #emit alebo v novej verzii __emit()

Zaujimave. Skoda ze nieje videt, ktora cast tak dlho trva, ci to vytvaranie alebo vyhladavanie. Lebo v praxi ta zaujima iba TryCustomCommand, nie pridavanie, co sa stane len pri nacitani FS :d Ale teda ono je to dost zaujimave tieto rychlosti, ze asi naozaj pojde o use-case. Len teda to sa blbo obhajuje, ono vacsinou ludi ako ATomasa a uprimne aj mna zaujima skorej najhorsi pripad. Pretoze ak su sytuacie, v ktorych je tvoj plugin podstatne pomalsi, tak to podstatne spomalenie moze sposobovat lagy, koly jednojadrovosti sampu.

 

Vyhledávání samotné je 6× rychlejší. Nejhorší případ se vyskytuje při řešení konkrétního problému, pro nějž hledáme adekvátní nástroj. Dynamické řetězce jsou dobré na jedny věci (zpravidla programování na vyšší úrovni), buffery a pole pevné délky na věci jiné. Koneckonců fakt, že i str_format má první argument format[] a ne String:format naznačuje, že mi nejde o kompletní nahrazení klasických řetězců.

Edit: Zkusil jsem přístup přímo k bufferu řetězce, ale STOR.I má patrně kontrolu adresy:

public OnFilterScriptInit()
{
    new String:str = @("ABCDEFGH");
    CallLocalFunction(#OnStringReceive, "d", _:str_buf_addr(str));
    print_s(str);
}

forward OnStringReceive(str[]);
public OnStringReceive(str[])
{
    printf("%s", str); //ABCDEFGH
    str[0] = 'X';
}

Jiné instrukce ve starší verzi AMX kontrolu nemají, takže by to s tím emitem šlo, ale je otázka, jak rychlé by to bylo.

Edited by IllidanS4

Sdílet tento příspěvek


Link to post
Share on other sites

Verze 0.3 vydána. Mimo jiné byla přidána podpora pro paralelní spouštění kódu:

public OnFilterScriptInit()
{
    print("A");
    threaded(sync_explicit)
    {
        for(new i = 0; i < 100000; i++) printf("%d", i);
    }
    print("B");
}

V bloku threaded se kód vykonává paralelně s hlavním vláknem serveru, což znamená, že server může vesele pokračovat ve své práci, aniž by se čekalo na skončení kódu. Parametr (sync_*) ovlivňuje, jakým způsobem je provedena synchronizace komunikace kódu se serverem: sync_explicit vykoná kód bez přerušení, tedy volání všech nativních funkcí je provedeno ve vlákně, a callbacky z vnějšku musí počkat, než kód skončí, nebo než je zavolána funkce thread_sync, která vyvolá jejich spuštění (něco jako yield v terminologii kooperativních vláken); sync_auto synchronizuje všechna volání nativních funkcí s hlavním vláknem a sync_interrupt při volání callbacku natvrdo vlákno pozastaví, ať je kdekoliv.

Návrh AMX není kompatibilní s používáním vícero vláken, takže platí, že v každém programu smí nejvýše jedno vlákno v každém momentě vyvolávat kód. Pokud chcete spouštět nějakou dlouhou operaci, doporučuji ji umístit do filterscriptu.

Sdílet tento příspěvek


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×