Jump to content

script Práca so súbormi typu ini


Tanga

Recommended Posts

Tento príspevok nie je určený pre nováčikov - ani ho nekomentujte prosím. 
Nech každý uváži či je nováčik, alebo nie.

Úvod:
Na začiatok ďakujem vEndovi za kódy k testovaniu rýchlosti y_ini a za skúšku môjho includu.
Ešte by som chcel povedať, že tento môj includ snáď nebude také zlyhanie ako môj predošlý includ na prácu so súbormi. Za ten sa svetu ospravedlňujem.
Y_less využil to, že prístup k RAM je rýchlejší než HDD. Vytvoril premennú, ktorá sa správa ako buffer - zapisuje na HDD až keď je buffer plný. Ja som zvýšil používanie RAM v mojom skripte oproti y_lessovi a nepoužívam tie vecičky ako tag, ...

Rýchlosť:

 

Porovnanie pri čítaní stringov:

Dini: 34059

yini:  15091ms
Môj:  10893  

Pri čítaní reťazcov pri správnom nastavení includu je ten môj skoro o tretinu rýchlejší.
Testovací skript

 

#include <a_samp>
#include <YSI\y_ini>
#include <subory>
#include <Dini>

#define MAX 100000

new stri[RIADOK_DLZKA];
INI:test[](name[],value[])
{
    INI_String("Riadok1",stri,sizeof(stri));
    INI_String("Riadok2",stri,sizeof(stri));
    INI_String("Riadok3",stri,sizeof(stri));
    INI_String("Riadok4",stri,sizeof(stri));
    return 1;
}

main() {
    new Subor:subor;
    new cas = GetTickCount();
    for (new i; i < MAX; i++) {
	dini_Get("test.ini", "ho*no");
	dini_Get("test.ini", "Riadok1");
	dini_Get("test.ini", "Riadok2");
	dini_Get("test.ini", "Riadok3");
	dini_Get("test.ini", "Riadok4");
    }
    printf("Dini: %dms", GetTickCount() - cas);
    cas = GetTickCount();
    for (new i; i < MAX; i++)
	INI_Load("test.ini");
    printf("yini: %dms", GetTickCount() - cas);
    cas = GetTickCount();
    for (new i; i < MAX; i++) { /* ked to bolo vo funkcii ako ini_load, nebola tam badatelna strata casu */
     	subor = OtvoritSubor("test.ini", 1);
	PrecitatString(subor, "ho*no", stri);
	PrecitatString(subor, "Riadok1", stri);
	PrecitatString(subor, "Riadok2", stri);
	PrecitatString(subor, "Riadok3", stri);
        PrecitatString(subor, "Riadok4", stri);
        ZatvoritSubor(subor, 1);
    }
    printf("Moj:  %dms\n\n", GetTickCount() - cas);
    return 0;
} 

 



Porovnanie pri zapisovaní stringov:

dini: 70529ms

yini:  14736ms
Moj:  11301ms

Opäť takmer o tretinu rýchlejšie.
Testovací skript:

 

#include <a_samp>
#include <YSI\y_ini>
#include <subory>
#include <Dini>

#define MAX 10000

main() {
    new Subor:subor, INI:filescript;
    VytvoritSubor("test.txt");
    print("Testovanie rychlosti zapisu - string:");
    new cas = GetTickCount();
    for (new i; i < MAX; i++) {
        dini_Set("test.txt", "textik", "hodnota");
        dini_Set("test.txt", "text1", "hodnota");
        dini_Set("test.txt", "text2", "hodnota");
        dini_Set("test.txt", "text3", "hodnota");
        dini_Set("test.txt", "text4", "hodnota");
    }
    printf("dini: %dms", GetTickCount() - cas);
    cas = GetTickCount();
    for (new i; i < MAX; i++) {
        filescript = INI_Open("yini.txt");
        INI_WriteString(filescript,"textik","hodnota");
        INI_WriteString(filescript,"text1","hodnota");
        INI_WriteString(filescript,"text2","hodnota");
        INI_WriteString(filescript,"text3","hodnota");
        INI_WriteString(filescript,"text4","hodnota");
        INI_Close(filescript);
    }
    printf("yini: %dms", GetTickCount() - cas);
    cas = GetTickCount();
    for (new i; i < MAX; i++) {
        subor = OtvoritSubor("test.txt", 0);
        ZapisatString(subor, "textik", "hodnota");
        ZapisatString(subor, "textik1", "hodnota1");
        ZapisatString(subor, "textik2", "hodnota2");
        ZapisatString(subor, "textik3", "hodnota3");
        ZapisatString(subor, "textik4", "hodnota4");
        ZatvoritSubor(subor, 0);
    }
    printf("moj:  %dms", GetTickCount() - cas);
    return 0;
} 

 



Použitie:


To už sa mi nechce písať, kuknite si hore testovacie skripty.
PrecitatString(subor, "kluc", str); do str uloží načítaný text.
Len dodám, že čítanie klúča, ktorý nie je v súbore zamrazí server.
Súbor pred otvorením treba vytvoriť - VytvoritSubor(menosuboru); resp skontrolovať SuborExistuje(meno);
Tá nula / jednotka pri zatvorení a otvorení znamená spôsob prístupu. 1 = čítanie, 0 = zápis.

Includ by ste si mali optimalizovať - otvorte ho a hore do max riadkov si zapíšte kolko riadkov bude mať váš súbor.
(Ak dáte menej, nič sa nepoškodí, ale bude to pomalšie. AK dáte viac, zaberie to viac pamate v RAM).

Ešte taký optimalizačný typ - aby ste sa vyhli používaniu strval, ... (pri zápisoch čísel) boolean sa dá lahko imitovať - uložte "0", alebo "1". Pri čítaní možno testovať takto:
PrecitatString(subor, "booleacek", str);
if (str[0] - '0') ...

 

EDIT: LOL, zabudol som link na stiahnutie - tu.

Link to comment
Share on other sites

  • Globální moderátor

no, takže nezkoušel jsem to ale jinak jestli to tak fakt je tak by to docela ušetřilo zase prostor, možná začnu používat jestli se mi to osvědčí :)

Link to comment
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
×
×
  • Create New...