Visos funkcijos grąžina reikšmę per savo vardą. funkcijos_vardas := ats; tas grąžinimas, o tarp pagrindinių begin ir end rašai ats := funckijos_vardas(parametrai);
Sveiki, teko parašyti straipsnį anglų kalba, tačiau noriu juo pasidalinti ir su lietuvių Front-ender'ių community. Originalu straipsnį rasite čia: https://www.devbridge.com/articles/increasing-sass-compiling-performance-or-when-every-second-counts/
Ar daug yra sekundė? O dvi, trys? Dešimt? Tokie klausimai man kilo nuo tada, kai pradėjome naudoti CSS preprocesorių SASS. Įrankis, kurio pagalba turėjome palengvinti ir pagreitinti savo darbą, kartais jį netgi prailgindavo, dėl savo compile’o greičio. Taip, įrankis mums leido suvienodinti savo kodą tarp kelių komandos narių, leido automatizuoti kodo rašymo, spritinimo ir kitus procesus, tačiau kelis mėnesius developinamas projektas, pasiekdavo 7-12 sec. ar net didesnes compile’o laiko ribas. Galbūt tai neatrodo daug, tačiau paskaičiuokime: tarkime, jog buildiname failą vieną kartą kas minutę, vidutinis build time 6-10sec = 8sec. Tai reiškia, jog nemaža dalis mūsų darbo laiko (1/7.5, kas yra 40/7.5 ~ 5.3 valandos) yra ne kas kita, kaip laukimas, kol SASS susicompilins. Tad ką mes galime padaryti? SASS su steroidais Logika čia gana artima automotibilių sportui - jei automobilis važiuoja labai lėtai, vadinasi kaltas jo variklis. Būtent tai mes ir padarysime, pakeisim variklį. SASS buildinimui panaudosime libsass, tai SASS port‘as C kalba. Libsass kūrėjai jau senai pastebėjo, jog Ruby tikai nėra gerai performinanti kalba ir SASS variklį reikia perkelti ant kalbos, kurią galėtum paleisti tiek įvairiose aplinkose ir kurios greitis tenkintų. Tolumoje jau girdžiu žmones, kurie sako „Palauk, palauk, o kaip compass? Kaip native ruby funkcijų naudojimas libuose? Pamiršai?“.
Karalius mirė? Tegyvuoja karalius! Taip, pasirinkus libsass aš turėjau atsisakyti dviejų visų mėgiamų sass frameworkų: „Compass“ ir grid‘o sistemos „Susy“. Jei susy atsirado dar visai nesenai, tai compass buvo labai didelė SASS populiarumo priežastis ir jo atsisakymas daug kam pasirodys neadekvatus, tačiau mes jį visai nesunkiai pakeisime. Susipažinkite – „Bourbon“. Bourbon – tai tik SASS paremta mixinų biblioteka, kuri yra beveik identiška „Compass“, tačiau „Bourbon“, mano nuomone turi didesnį išpildymą, nepriklausomumą, greitį ir dokumentaciją. Pavyzdiniame projekte, pakeitus „Compass“ į „Bourbon“, su kiekvienu importo pakeitimu compile time sumažėdavo 0,6~ sekundės (visas compile time apie 10sec). Tad ką mes laimėjome ir ką praradome iškeitę „Compass“ į „Bourbon“? Laimėta: a) Greitis (build time, net nepakeitus buildinimo engine tapo greitesnis) b) Didesnis išpildymas – papildomai gausite tikrai kokybišką grido sistemą - „Neat“, ir ne tokią svarbią componentų ir add’ons bibliotekas. c) Dokumentacijos stilius yra pesonalinis dalykas, tačiau „Bourbon“ dokumentacija man žymiai aiškesnė. d) Bourbon yra „pure“ SASS, jį galima naudoti tiek su libsass tiek su ruby sass compileriu. f) Jau integruotas CSS animacijų paketas (keyframes, animation ir t.t.) g) Compass iš esmės stengiasi padaryti viską, bet kaip žinoma, įrankiai skirti viskam, dažniausia nėra tinkami geriausiems ir sparčiausiems sprendimams. Netgi visų mėgstamas spritinimo helperis compasse nėra optimaliai parašytas, nes sprite’ai yra pertikrinami kas kiekvieną sass failo modifikaciją, kai tuo tarpu, logiška būtų juos tikrinti tik tuomet, jei grafiniai failai buvo pridėti į sprite. h) Compass labiau mėgsta įsibrauti į jūsų sistemą ir turi kelis erzinančius dependencies.
Prarasta: a) Compass Inline-image funkcija, kuri buvo patogi, tačiau galima gyventi ir be jos. b) Sprite‘ų generavimas (kaip mes tai pakeisime – apie tai, vėliau)
Grido sistema gali kelti performance bėdų? Really? Mano atveju, teko keisti ir grid sistemą. Naudotas susy, jau pusę metų neišsprendžia savo bėdų performance srityje https://github.com/ericam/susy/issues/325, taip pat, jis priklauso nuo ruby, tad teko jo atsisakyti. Žinoma, skaitydami šias eilutes, galvojate, jog vėl sutaupysime vidutiniškai puę sekundės, tačiau, norėčiau atkreipti Jūsų dėmesį į šį grid‘o sistemų palyginimą: http://jeffreydegraaf.nl/2014/07/04/performance-of-sass-grid-systems/ Kaip matote, Neat ir Susy performance skirtumas yra gana didelis (0.3~1,2 sec versus 7~8sec.). Gana įspūdinga? Būtent todėl ir pasirinkau „Neat“, nes jis panašus į „Susy“, LABAI greitas, nepriklausomas nuo Ruby ir labai gerai dokumentuotas. Užteks kalbėti, rodyk skaičius. Gerai, tad tarkime, jog turime seną projektą, kiek mes galime sutaupyti? Generation of average project file (240KB size) Compass + susy + sprites – empty cache: 16-17s. Compass + susy + cache + sprites: 10-12sec. Libsass + neat + bourbon + sprites + grunt-watch: 1.6 sec. Libsass + neat + bourbon + sprites + grunt watch with (spawn:false): 0.6 sec. Kaip matote, skirtumas yra milžiniškas.
Įtikinai, tik kaip visa tai efektyviai sujungti? Ir kaip dėl sprite’ų? Turbūt ne paslaptis, jog didelė dalis front-end developerių laikosi įsikandę compass tik dėl sprite’ų generavimo. Libsass ir automatizuotas spritinimas? Taip, tai įmanoma, kaip ir minėjau, sprite‘ų automatizavimo atsisakyti nereikės, tačiau tam, jog viskas veiktų, reikės grunt arba gulp. Jei dar nesate susipažinę su šiuo įrankiu, tai pasiskaitykite čia (asmeniškai, pirmenybę teikiu Grunt, todėl instrukcijas pateiksiu tik jam): http://gruntjs.com/ Jums eikės: Node naujausios versijos: http://nodejs.org/download/ Parsisiųskite sample libsass projektą: https://github.com/devbridge/Front-End-Toolkit/tree/master/starter-template-libsass kai susiinstaliuosite Node, įsijunkite node command line ir nueikite į projekto direktoriją: įveskite komandą: npm install Ir viskas, galite pradėti dirbti :)
Pirmam paleidimui duokite komandą „grunt“, bus sugeneruoti pradiniai failai, sprite‘ai. Dirbant naudokite task‘ą grunt watch, jis stebės scss failus ir img failus ir jiem pakitus, atitinkamai reaguos.
Jei kažkas nepavyko – rašykite komentaruose, pabandysiu pagelbėti.
Faster! Tam, jog taupyti laiką ir tik atsinaujinus CSS failui, vaizdas būtų perpieštas, esu pasirašęs mažą chrome extensioną, galbūt pravers ir Jums: https://chrome.google.com/webstore/detail/prototool-css-auto-refres/kobijmefblkndpicohiondpdnpojebjd
Final thoughts Tiesą sakant, šis research‘as davė man labai daug patirties apie tai, kaip aš ateityje rinksiuosi įrankius. Tai padėjo man suvokti, jog sass plugins‘ai, extension‘ai negali savyje turėti kitos kalbos panaudojimo kaip SASS. Tai leidžia vėliau išvengti suderinamumo ir palaikomumo problemų ir esant dideliems pokyčiams, leidžia greitai daryti pakeitimus esant poreikiui. Taip pat, developinant didelius projektus, kritiškai svarbu atsižvelgti į įrankio spartą. Tikiuosi mano postas Jums padės atsikratyti beverčio laukimo ir leis atsilaisvinusį laiką panaudoti geresniems tikslams. Galbūt turite įdėjų kaip visa tai dar labiau pagreitinti, o gal turite pastabų ar pastebėjimų? Rašykite komentarų skiltyje! Ačiū!
as tai pritariu vieno lietuvos dizainerio pasakymui, kad vyras privalo tureti pakankamai gera - kokybiska dirza, grazius marskinius, batus ir Palta. Man asmeniskai labai patinka kuo baltesni marskiniai, dzinsai ir vilvetinis svarkas, auksinis didelis ziedas su juoda akim ant maziausio pirsto. Kam didziausia silpnybe jauciu be moteru tai kuo plonesniems telefonams, televizoriams ir kuo imanoma baltesniems baltiniams :D
program Noname4;
Type miestas = record
pav : string[20];
aps : string[13];
gyv : longint;
end;
Type apskritis = record
pav : string[20];
gyv, maz : longint;
end;
Mas = array[1..103] of miestas;
Mas2 = array[1..103] of apskritis;
var miestai : Mas;
apsk : Mas2;
n,i,j,apssk:integer;
output,input:text;
procedure rikiuoti(var apsk:Mas2; sk:integer);
var i, j:integer;
kelti:apskritis;
begin
for i := 1 to sk do
for j := i to sk do
begin
if(apsk[i].maz > apsk[j].maz) then
begin
kelti := apsk[i];
apsk[i] := apsk[j];
apsk[j] := kelti;
end
else if((apsk[i].maz = apsk[j].maz) AND (apsk[i].pav > apsk[j].pav)) then
begin
kelti := apsk[i];
apsk[i] := apsk[j];
apsk[j] := kelti;
end;
end;
end;
procedure iapskritis(miest:Mas; n:integer; var aps : Mas2; var sk : integer);
var i, j: integer;
begin
sk := 1;
aps[1].pav := miest[1].aps;
aps[1].gyv := miest[1].gyv;
aps[1].maz := miest[1].gyv;
for i := 2 to n do
begin
for j := 1 to sk do
begin
if (miest[i].aps = aps[j].pav) then
begin
aps[j].pav := miest[i].aps;
aps[j].gyv := aps[j].gyv + miest[i].gyv;
if (aps[j].maz > miest[i].gyv) then
aps[j].maz := miest[i].gyv;
miest[i].pav := '';
end;
end;
if (miest[i].pav <> '') then
begin
sk := sk + 1;
aps[sk].pav := miest[i].aps;
aps[sk].gyv := aps[sk].gyv + miest[i].gyv;
if (aps[sk].maz > miest[i].gyv) then
writeln(miest[i].gyv);
aps[sk].maz := miest[i].gyv;
miest[i].pav := '';
end;
end;
end;
begin
assign(input, 'U2.txt');
reset(input);
readln(input, n);
for i := 1 to n do
readln(input, miestai[i].pav, miestai[i].aps, miestai[i].gyv);
iapskritis(miestai, n, apsk, apssk);
rikiuoti(apsk, apssk);
for i := 1 to apssk do
writeln(apsk[i].pav, apsk[i].maz,' ', apsk[i].gyv);
readln;
close(input);
end.