Wolne wykonywanie poleceń aplikacji konsolowych


(pawelek5) #1

Witam,

Postanowiłem sprawdzić szybkość wykonywania poleceń aplikacji konsolowych tym o to kodem [bATCH]:

@echo off

set /a licznik=1

:poczatek

echo Do licznika zostanie dodana wartość +1...

set /a licznik=licznik+1

echo ***Wartosc licznika to teraz %licznik%!***

goto poczatek

Wychodzi mniej więcej, że w 17 sekund mój komputer dobija licznik do wartości 10 000. Ale czy to nie za mało? Podobno dzisiejsze komputery wykonują mniej więcej 2,5 miliarda obliczeń, akcji na sekundę (2.50 GHz). Biorę pod uwagę, że procesor nie jest tylko wykorzystywany przez ten 1 program, bo w tle mam 80 procesów (~3% CPU), że ma robić 3 polecenia, bo wyświetlać, dodawać i wyświetlać w kółko, że konsola wykorzystuje 1 wątek z 4, ale aż tak powoli (jak na komputer) to się nalicza?

Czy mógłby mi ktoś wyjaśnić, dlaczego? A może jest jakiś limit wykonywanych na sekundę operacji konsolowych? Użycie CPU przez konsolę to 10% to dlaczego MAX wątku (~25%) nie wykorzystuje?


(kostek135) #2
  1. Nie istnieje instrukcja, która mieści się w jednym takcie.

  2. Wliczasz w to przełączanie kontekstu i czas pobytu wywołania w kernel space?

  3. Nie wykonujesz jednej operacji, pisanie to też operacja (bardziej skompilkowana), a poztym to najbardziej pochłaniające (wychodzisz z błędnego założenia, że operacja jest równa operacji względem czasu) są operacje IO, zapisz kod tak:

    @echo off

    set /a licznik=1

    :poczatek

    set /a licznik=licznik+1

    if %licznik% == 10000 ( echo "works" )

    goto poczatek

u mnie na oko z 3 sekundy

I tak wynik żenujący bash ma znacznie lepszy performance.

  1. To jest język interpretowany, takie zawsze są wolniejsze od kodu natywnego. Język ten nie musi być w żaden sposób optymalizowany, bo po co on służy do uruchamiania innych programów, a nie liczenia przekształceń macierzowych.

-- Dodane 13.09.2013 (Pt) 22:22 --

Zauważyłem jeszcze to pytanie

Raczej nie ma poza tym co wyżej opisałem dochodzi pytanie, skąd wiesz co ten % oznacza tak z ciekawości pytam (jakie składowe na niego wpływają) pod linuksem da się dość szczegółowo to obejrzeć w jakich segmentach ten czas i na co konkretnie się rozkłada. Tutaj tylko zrobili taka jakąś liczbę, co by fanboje przeglądarek się pozabijali, że u nich to jest tylko 30% a u innych to 50% i fe be fuj?


(pawelek5) #3

Ale ja dalej nie rozumiem. Komputer to wielka maszyna licząca, z takim nabijaniem licznika (nawet jak ma jeszcze coś wyświetlać) to nie powinna mieć problemu...

Z tym kodem, co mi podałeś to o wiele szybciej jest (też około 3 sekund).

A czy w C++ komendy wysyłane konsoli są już przetłumaczone na język komputerowy? Będą wykonywane tak samo szybko jakbym zrobił to normalnie w C++, a nie wysyłaniem do cmd?

system(komenda_wysylana_do_konsoli);

(Drobok) #4

Co do funkcji system, to jest to normalnie wysyłane do konsoli (tak jak byś użył win+r)


(kostek135) #5

Nie wiem czego nie rozumiesz. Napisz sobie analogiczny kod maszynowy (dwa programy: cout co obrót i cout po wszystkich obrotach, zobacz różnicę - przy czym przy kodzie maszynowym proponuje 10^7 - 10^8 iteracji). Przerwanie z punktu widzenia systemu jest bardzo czasochłonne. Dodatkowo wątpię, żeby cmd (w domyśle interpreter skryptu batch) cokolwiek buforowało.

Nie rozumiem zdania. Gramatyka w nim nie istnieje. Odniosę się więc tylko do kodu. Takie wywołanie uruchomi program, czyli jeśli będzie to skrypt to będzie skrypt iterpretowany przez cmd, jeśli jakiś program maszynowy to załadowane zostaną instrukcje procesora. Jeśli przekażesz polecenie uruchomienia JAVY z plikiem jar, uruchomisz jvm. Nie wiem czy to będzie odpowiedzią na twoje "pytanie".

[edit]

Pozatym tak jak mówię. To jest jakaś dziwna przypadłość MS-owych patologii uruchamiam następujący skrypt bashowy

#!/bin/bash


a=0


for(( i=1; i<=10000; i++ )) {

	echo $a

	a=$(( a+1 ))

}


echo $a

poleceniem

time ./skrypt.sh

to otrzymuję następujące wyniki

real	0m0.360s

user	0m0.164s

sys	0m0.052s

więc prawdopodobnie, ponieważ na dobrą sprawę nikt nie używa skryptów batchowych większych niż uruchom program, a basha używa się do administrowania serwerami, to jest choć trochę zoptymalizowany.