Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Wskaźniki


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
2 odpowiedzi w tym temacie

#1 csMaster

    Wszechwiedzący

  • Power User

Reputacja: 14
Początkujący

  • Postów:554
  • Lokalizacja:localhost
Offline

Napisano 09.04.2022 18:20

W amxx co prawda nie ma wskaźników takich jak w C++, ale są funkcje którymi można naśladować ich zachowanie:

get_var_addr();
get_addr_val();
set_addr_val();

Czy używanie tych funkcji w celu odwoływania się do zmiennych będzie szybsze niż ich normalny odczyt/zapis ?

 

Czy taki kod:

new Data[10000];
new pData = get_var_addr(Data);
for(new i = 0; i < 10000; i++, pData += 4) {
    set_addr_val(pData, i);
    log_amx("%i", get_addr_val(pData));
}

wykona się szybciej o takiego ?

new Data[10000];
for(new i = 0; i < 10000; i++) {
    Data[i] = i;
    log_amx("%i", Data[i]);
}

Teoretycznie skoro podaje adres zmiennej i potem go tylko zwiększam, to cała operacja powinna być szybsza niż gdyby serwer musiał sam szukać tych adresów. Ale get_var_addr() nie zwraca rzeczywistej pozycji zmiennej w pamięci serwera a jedynie jej lokalny adres, inny dla każdego pluginu. Do tego kompilator może stosować jakieś optymalizacje o których sam nie wiem. Więc właściwie czy wykorzystywanie tych trzech funkcji może w ogóle jakoś przyspieszyć wykonywanie kodu ?

 


  • +
  • -
  • 0

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 584
Godlike

  • Postów:12 053
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 09.04.2022 21:56

Nie wydaje mi się aby przyspieszyło to działanie wręcz spowolniło by


  • +
  • -
  • 1

#3 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 19.04.2022 20:29

Trochę późno, ale też tak uważam jak DarkGL.

 

Ogólnie to natywy są wywoływane w bardzo ciekawy sposób, poprzez instrukcję asemblera `sysreq.c` (https://raw.githubus...oc/pawn-imp.pdf), która przyjmuje numer funkcji (system service się to bodajże nazywało w docu) do wywołania i to dopiero wywołuje tą funckję i potem wraca.

 

A takie bezpośrednie odwoływanie się do tablicy jest dużo lepsze, bo nie generuje nam instrukcji `sysreq.c`.

 

Porównaj sobie asembler (załącznik) z twojego kodu:

 

 


#include amxmodx
public func1(){
    new Data[10000];
    new pData = get_var_addr(Data);
    for(new i = 0; i < 10000; i++, pData += 4) {
        set_addr_val(pData, i);
        log_amx("%i", get_addr_val(pData));
    }
}
public func2(){
    new Data[10000];
    for(new i = 0; i < 10000; i++) {
        Data[i] = i;
        log_amx("%i", Data[i]);
    }
}

 

 

 

Ale nie przejmowałbym się takimi optymalizacjami, David Anderson zrobił świetną robotę dawno temu dokładając JIT'a do AMXX'a przez co maszyna wirtualna AMXX nie musi wykonywać instrukcji pawnowych, a natywny asembler (x86 czy x64 zależy na czym odpalasz to). Polecam poczytać kod źródłowy AMXX'a, bardzo pomaga w zrozumieniu jak ta machineria działa pod spodem :) 

Załączone pliki


  • +
  • -
  • 2




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych