Wydajność i zmienne w pętli

Wydajność i zmienne w pętli

Wątek przeniesiony 2023-02-12 01:35 z Delphi i Pascal przez flowCRANE.

M4
  • Rejestracja:około 6 lat
  • Ostatnio:ponad rok
  • Postów:29
0

Ostatnio sprawdziłem z ciekawości na ile pozwolić sobie będzie mógł pascal przy użyciu FPC na starym komputerze bez karty graficznej itp. Moim oczom ukazał się zdumiewający rezultat bowiem wykonanie się zmiany wartości jednej zmiennej dwustukrotnie na sekunde spowodowało zużycie mocy obliczeniowej procesora o połowę.

W programie funkcjonują cztery zmienne gdzie tylko pierwsza zmienia swoją wartość tak szybko. Wartość drugiej zmiennej zmienia się jednorazowo co wyzerowanie się wartości zmiennej pierwszej co następuje po osiągnięciu wartości bliskiej tysiącu jednostek a wartości pozostałych zmiennych natomiast są podstawionymi wartoścami dwóch poprzednich zmiennych z nałorzoną dodatkową operacją matematyczną jedynie dodającą do wartości określoną stałą liczbę.

Wszystko dzieje się w niekończącej się pętli. W praktyce wartości owych zmiennych oznaczają współrzędne ekranu wyrażane w polach co przetwarzane jest następnie na położenie na ekranie w ramach rozdzielczości ekranu co nie ma większego znaczenia na ten moment dla reszty programu ponieważ zgrupsza stanowią je wcześniej wspomniane zmienne i ich funkcjonalność.

Optymalizacja tak prostego programu przy jednoczesnym wykorzystaniu podstawowych funkcji języka bez używania wstawek asemblerowych zdaje się być nieosiągalna.

Wniosek: Commodore64 radził sobie lepiej z Basic'iem prawie pół wieku temu niż stacjonarka z Pascal'em dzisiaj.

edytowany 2x, ostatnio: matej47
jarekr000000
A gdzie screeny z Komody?
flowCRANE
Robił pewnie Polaroidem.
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:16 minut
  • Postów:2068
5

Pamiętaj że wklejenie "print screen" z czterech linijek tekstu to skrajne marnotrawstwo zasobów i świadczy o Tobie !
Drżenie rak spowodowane jest nadmiarem alkoholu ? Bo zdjęcia i tak nieczytelne


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
M4
Wartości zmiennych drugiego zdjęcia ulegała zmianie z częstotliwością dwustu zmian na sekunde a efekt tego uchwycony jest na zdjęciu. Print screen o którym mówisz to jak rozumiem funkcja write. Coż, po to ona istnieje aby z niej korzystać. Nie wyświetlam ich więcej niż potrzebuję tylko raz a i tak powstały w kodzie tylko po to by zwizualizować problem na forum. Za chwilę uruchomię ten sam program bez tych funkcji i opublikuję efekt chociaż wydaje mi się że obejdzie się bez różnicy.
M4
Tak jak myślałem okazało się że miałem rację.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
2

[...] spowodowało zużycie mocy obliczeniowej procesora o połowę

W jaki sposób moc obliczeniowa może się zużywać?


Zobacz pozostałe 2 komentarze
M4
Jak powinienem to ubrać w słowa twoim zdaniem?
AK
Polska język trudna język
M4
Poza tym jestem dyslektykiem a to jest forum informatyczne a nie humanistyczne chociaż z czasem zaczynam wątpić w to pierwsze.
Patryk27
Oki, po prostu dosłownie nie rozumiem co masz na myśli 😅 Podrzuciłeś screenshota na którym widać zużycie procesora na poziomie 50% - no ale przy jednowątkowej aplikacji odpalonej na dwurdzeniowym procesorze to jest spodziewane, nie?
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:16 minut
  • Postów:2068
4

@matej47 opisz metodologię testowania, co to znaczy lepiej ?
Przy mglistych kryteriach to można udowodnić każdy wniosek np. matiz jeździ lepiej od BMW


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 1x, ostatnio: Marius.Maximus
M4
Wniosek był prześmiewczy a ty wziąłeś go na powarznie i jeszcze mówisz coś o alkocholiźmie. Co ty w ogóle tu robisz?
Marius.Maximus
Ja niewątpliwie uśmiechnąłem się w tym wątku, parę zdań i obrazków a każdy znajdzie coś dla siebie śmiesznego!
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Postów:3561
2

Bosch ... pomyślałeś CO TESTUJESZ ?
Bo 99% czasu zjada NIE zmiana prostych zmiennych

(ps pewnie dlatego wstydzisz sie podac kod)


Bo C to najlepszy język, każdy uczeń ci to powie
M4
Wystarczyło poprosić ale nawet na to cię nie stać.
DN
@AnyKtokolwiek: proś Pana swojego o kod jego
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12164
3

@matej47: jeśli nie umiesz robić benchmarków, to nie zwalaj winy na język, że powolny. :D

Doprecyzuję może. Nieskończona pętla działająca w ramach jednego wątku, która nie wykorzystuje mechnizmów usypiających, takich jak np. funkcja Sleep z biblioteki systemowej, podczas działania będzie zużywać pełną moc jednego rdzenia CPU. Twój procesor ma dwa rdzenie fizyczne, więc zużycie będzie wynosiło mniej więcej 50%. U mnie będzie to średnio 35-40%, dla dwóch rdzeni fizycznych (czterech logicznych) i przy włączonym Hyper-Threadingu. Nie jest to zależne ani od procesora, ani od użytego języka programowania, bo dany rdzeń będzie działać na pełną moc w trakcie wykonywania kodu programu.

matej47 napisał(a):

Moim oczom ukazał się zdumiewający rezultat bowiem wykonanie się zmiany wartości jednej zmiennej dwustukrotnie na sekunde spowodowało zużycie mocy obliczeniowej procesora o połowę.

A w jaki sposób regulujesz częstotliwość aktualizacji tej zmiennej? Spinlockiem? Przy okazji — benchmarków nie robi się w ten sposób, że się otwiera Menedżer zadań i gapi na wykresy. To jest smutny żart, nie benchmark.

W programie funkcjonują cztery zmienne gdzie tylko pierwsza zmienia swoją wartość tak szybko. Wartość drugiej zmiennej zmienia się jednorazowo co wyzerowanie się wartości zmiennej pierwszej co następuje po osiągnięciu wartości bliskiej tysiącu jednostek a wartości pozostałych zmiennych natomiast są podstawionymi wartoścami dwóch poprzednich zmiennych z nałorzoną dodatkową operacją matematyczną jedynie dodającą do wartości określoną stałą liczbę.

Bla bla bla…

screenshot-20230130123247.png

Optymalizacja tak prostego programu przy jednoczesnym wykorzystaniu podstawowych funkcji języka bez używania wstawek asemblerowych zdaje się być nieosiągalna.

Dla takiego ignoranta jak Ty, zapewne tak jest. :D


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 4x, ostatnio: flowCRANE
Zobacz pozostały 1 komentarz
flowCRANE
Jesteś ignorantem, bo w obliczu braku wiedzy, wolisz smarować posty na forum i rozpowszechniać bzdury, zamiast się dokształcić i wiedzieć o co chodzi.
M4
Skoro forum nie jest źródłem wiedzy to wiele to wyjaśnia dlaczego jest tu więcej ideologii niż nauki.
flowCRANE
Gdybyś sam nie był przykuty do ideologii deprecjonowania Pascala, to byś może się czegoś nauczył.
M4
Na jakiej podstawie stwierdzasz taką tezę?To że wolę Pascal'a nie oznacza że stronię od innych dobrodziejstw postępu technologicznego. Skąd możesz to wiedzieć? To że tego nie okazuję nie znaczy że nie mam z tym nic wspólnego.
flowCRANE
Tezę się stawia, nie stwierdza. Stwierdzam, że deprecjonujesz Pascala, bo jedyne na co było Cię stać to na jakieś śmieszne benchmarki i smarowanie wypaczonych wniosków na forum (bez żadnych konkretów, w tym głównie bez kodu źródłowego), w taki sposób, aby wyśmiać Pascala. Problem w tym, że Pascal miał się i ma nadal dobrze, jest językiem kompilowanym do relatywnie efektywnego kodu, a zamiast śmiać się z języka, śmiejemy się z Twoich metodologii określania jakości kodu i języka.
M4
  • Rejestracja:około 6 lat
  • Ostatnio:ponad rok
  • Postów:29
0

Dla jasności.
Myślicie że dlaczego nie poruszyłem w tym temacie kwestii wstawek asemblerowych?
Jestem świadom uciążliwości podstawowych funckji w większych projektach.
Co do kodu to możecie sami sobie wyobrazić taki kod ale uproszcze wam zadanie i powiem wam że głównym winowajcą zapewne jest:

Kopiuj
zmienna:=zmienna+wartosc;

zamiast tego powinno być choćby..:

Kopiuj
Inc(zmienna);

..ale to już asembler a nie Pascal czego chyba nikt nie zrozumiał.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12164
4

No to może przestań już marnować nasz czas i pokaż kod źródłowy, który testowałeś — od razu wszystko się wyjaśni. Chyba że nadal wolisz uprawiać wodolejstwo i tłumaczyć się w coraz to bardziej absurdalny sposób, to sobie siedź w swoim bagienku przekonań, że Pascal jest powolny, bo inkrementacja zmiennej trwa dwa dni.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:16 minut
  • Postów:2068
3

Załóżmy zgodnie z tezą OP że nikt nie zrozumiał co OP miał na myśli.
To czy problem leży po stronie autora wątku czy też wszyscy inni są winni ?


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12164
5

Pierwszy post jasno pokazuje, że jego autor ani nie potrafi tworzyć sensownych benchmarków do mierzenia wydajności kodu, ani nie potrafi poprawnie określić jakości technologii. Do tego celowo nie pokazuje żadnych dowodów na poparcie swoich tez, w tym nie pokazuje kodu źródłowego, który rzekomo testował, a także nie posiada podstawowej wiedzy z zakresu programowania, działania systemów operacyjnych. Jedyne na co go stać to na lanie wody i pokazywanie zrzutów ekranu zrobionych ziemniakiem, nie wiadomo czego dotyczących.

Ten wątek to smutny żart — jego autor chciał zabłysnąć, a jedynie się zaorał.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
4

zamiast tego powinno być choćby..: [...]

Ale czym w zasadzie miałoby się różnić jedno od drugiego? 👀

Inline'ing ogarniały kompilatory już w latach osiemdziesiątych, więc wydaje mi się dosyć nieprawdopodobne, aby między inc a = + była jakakolwiek różnica w FPC w 2023 (chyba że na danym typie operacje różnią się sematycznie, tj. robią coś innego - ale w przypadku liczb jedno i drugie działa identycznie afair).


edytowany 5x, ostatnio: Patryk27
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12164
2

W debugu (bez mocniejszych optymalizacji), instrukcja Inc(Foo) tłumaczona jest bezpośrednio do rozkazu addl, natomiast konstrukcje Foo := Foo + 1 oraz Foo += 1 są tożsame, tłumaczone do rozkazów add i mov:

screenshot-20230130163305.png

To jednak nadal nie zmienia faktu, że CPU potrafi wykonać setki milionów inkrementacji na sekundę. Sprawdziłem to sobie prostym kodem, z optymalizacjami -O1, czyli przyjazymi debuggerowi:

Kopiuj
{$mode objfpc}{$H+}

uses
  Windows;
var
  Foo: Integer = 0;
  TimeBegin, TimeEnd, I: Integer;
begin
  TimeBegin := GetTickCount();

  for I := 0 to 999999999 do
    Foo += 1;

  TimeEnd := GetTickCount();
  WriteLn('time: ', TimeEnd - TimeBegin, ' ms');
end.

Miliard inkrementacji zmiennej w pętli na moim 10-letnim laptopie trwa średnio 2469 milisekund, czyli na sekundę przypada średnio 405 milionów inkrementacji. Oczywiście mierzone nie są same inkrementacje, bo testowanie warunku pętli i związane z tym skoki warunkowe też zabierają czas procesorowi. Ale to nie ma znaczenia, bo gdzie rzekome 12 inkrementacji na sekundę u autora, a gdzie kilkaset milionów. :D

Ntaomiast w trybie release ten sam test daje wynik średnio 2172 milisekund, dla wszystkich trzech sposobów inkrementacji. Najwyraźniej FPC optymalizuje proste inkrementacje do minimalnej liczby rozkazów, stąd zauważalny zysk czasowy (ale nie chce mi się tego sprawdzać).


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 5x, ostatnio: flowCRANE
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
furious programming napisał(a):

... bo testowanie warunku pętli i związane z tym skoki warunkowe też zabierają czas procesorowi. Ale to nie ma znaczenia, bo gdzie rzekome 12 inkrementacji na sekundę u autora, a gdzie kilkaset milionów. :D

Kopiuj
{$mode objfpc}{$H+}

uses
  Windows;
const
  TestSize:Integer=1000000000;
var
  Foo:Integer=0;
  Foq:Integer=0;
  Fop:Integer=0;
  TimeBegin,TimeMid,TimeEnd,I:Integer;
begin
  TimeBegin := GetTickCount();
  for I:=1 to TestSize do
  begin
    Foo+=1;
  end;
  TimeMid:=GetTickCount();
  for I:=1 to TestSize do
  begin
    Foq+=1;
    Fop+=1;
  end;
  TimeEnd:=GetTickCount();  
  WriteLn('time inc only: ',TimeEnd-2*TimeMid+TimeBegin,' ms'); //(TimeEnd-TimeMid)-(TimeMid-TimeBegin)
end.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Zobacz pozostałe 12 komentarzy
jarekr000000
@_13th_Dragon: tak, jest. W zasadzie to nie wiadomo po co tu mieszamy Pascala :-). Sorry, ale jestem uczulony na benchmarki takie jak ten powyżej - pełno w necie, tony bzdurnych wniosków.
_13th_Dragon
Na określenie rządu wielkości - ujdzie, na nic innego się nie nadaje.
jarekr000000
@_13th_Dragon: w javie taki kod nie podałby Ci nawet rzędu wielkości - wyniki od absurdalnie długich czasów do zera, w zależności od tego "kiedy" uruchamiane, jaki jvm, jakie parametry jvm i ile przebiegów pętli.
_13th_Dragon
W Javie w zasadzie każdy test wydajnościowy jest mocno zaburzony z powodu GC i efektu Stop The World
jarekr000000
@_13th_Dragon: to akurat część JVM, więc normalne testy to uwzględniaja i mierzą - nie widze problemu. Tzn. masz problem jak mierzysz przez start = getTime(); kod; end = getTime(), ale w takim przypadku to GC i stop the world to najmniejszy problem.
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:4 minuty
2

@matej47:

Zamiast zrzutów ekranu pokaż kod!
Procesor Commodora miał taktowanie rzędu kilkunastu megaherców i był ośmiobitowy. Obecne procesory mają taktowanie na poziomie kilku gigaherców czyli 200 -300 razy większe oraz słowo 32 albo 64 bity. To jest wydajnościowa przepaść. Coś zawaliłeś w kodzie i zwalasz swój błąd na kompilator.

edytowany 5x, ostatnio: grzegorz_so
cerrato
Raczej nie tyle coś skopał i zwala na kompilator, co ewidentnie trolluje. Rzucił przynętę, a potem ma radość, że się ludzie produkują :D
jarekr000000
Sprostowanie: processor w przesławnej komodzie - C64 miał jeden (1) megaherz taktowania, do tego bywał wstrzymywany, bo układ graficzny miał pierwszeństwo w dostępie do danych, dodatkowo robił jeszcze tzw. odswiezanie pamięci (nie dramat, ale jakies 10-20% cykli mogło przepaść (nie pamiętam dokładnie)).
GS
@jarekr000000: masz rację, kilkanaście MHz to były czasy pierwszych PC'tów :)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12164
1

Ten wątek to zwykły trolling. Przecież wiadomo, że inkrementacja zmiennej sprowadza się raptem do kilku rozkazów CPU, więc to niemożliwe, aby kilkanaście inkrementacji powodowało długotrwałe zużycie mocy obliczeniowej.

Tak czy siak ten wątek najpewniej wyląduje w perełkach, bo do niczego innego się nie nadaje. ;)


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)