piątek, 24 czerwca 2022

C vs Python

Postanowiłem porównać szybkość znajdowania liczb pierwszych w językach programowania C i Python najprostszym algorytmem sprawdzającym dzielniki badanej liczby.

Dla przypomnienia: Liczba pierwsza to liczba naturalna, która ma dokładnie dwa dzielniki naturalne - jedynkę i samą siebie. Wykaz początkowych liczb pierwszych: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271 itd. Liczby naturalne większe od 1, które nie są pierwsze, nazywa się liczbami złożonymi. Liczby 4 i 6 są więc przykładami liczb złożonych. Z podanych definicji wynika, że liczby 0 i 1 nie są ani pierwsze, ani złożone. Liczby pierwsze są stosowane w niektórych algorytmach kryptograficznych np. RSA.

Algorytm jest bardzo prosty: dla badanej liczby naturalnej n sprawdzamy, czy liczby naturalne należące do przedziału [2, ... ,  √n] są dzielnikami naszej liczby n. Jeżeli okazało by się, że któraś z tych liczb jest dzielnikiem naszej liczby n, oznacza to, że nasza liczba nie jest pierwsza.

Mój test polega na tym, że mierzony jest czas sprawdzenia 8 milionów liczb, czy są liczbami pierwszymi. Pierwszy program jest napisany w języku C:

#include <stdio.h>
#include <math.h>
#include <time.h>

#define FALSE 0
#define TRUE  1
  
int is_prime(int n) {
  if (n<2) {
    return FALSE;
  }
  else if (n==2) {
    return TRUE;
  }
  else {
    for (int i=2; i<=(int)ceil(sqrt(n)); i++) {
      if (n % i == 0) {
        return FALSE;
      }
    }
    return TRUE;
  }
}

int main() {
  int max = 8000000;
  time_t t1, t2;
  
  printf("Checking %d numbers. Please wait...\n", max);
  
  t1 = time(NULL);
  
  for(int i=1; i<=max; i++) {
    is_prime(i);
    //printf("%d   %d\n", i, is_prime(i));
  }
  
  t2 = time(NULL);
  printf("Done in %ld seconds.\n", t2-t1);
}

Program kompilujemy następująco:

gcc primes-search.c -o primes-search -lm

lub

cc primes-search.c -o primes-search -lm

Drugi program jest w języku Python 3:

import math
import time

def is_prime(n):
  if n < 2:
    return False
  elif n == 2:
    return True
  else:
    # range = 2..math.ceil(math.sqrt(n))
    for i in range(2, (int)(math.ceil(math.sqrt(n))) + 1):
      if n % i == 0:
        return False
    return True
    

max = 8000000

print("Checking %d numbers. Please wait..." % max)

t1 = time.time()

for i in range(1, max):
  is_prime(i)
  #print("%d   %d" % (i, is_prime(i)))
  
t2 = time.time()
print("Done in %d seconds." % (t2-t1))

Kody źródłowe są tutaj:

https://github.com/adamblaszczyk/primes-search__c_vs_python

Czasy wykonania programów:

LENOVO ThinkPad E440, Intel Core i3-4000M 2.4GHz - FreeBSD 13.0 64-bit

.c - 21 sekund

.py - 124 sekundy


poniedziałek, 7 marca 2022

X Window System


X Window System – środowisko okien graficznych stworzone w latach 80. XX wieku w laboratoriach MIT (pierwsze wydanie X1 w czerwcu 1984 roku). Jest stosowamy głównie w systemach Unix i Linux. Najnowszym wydaniem jest wersja 11. Często oprócz X Window System stosuje się też nazwę X, X11, X11R6 (dla implementacji X.Org w wersji 6) lub X11R7. Najpopularniejszymi implementacjami X Window System są X.Org oraz XFree86.

X Window System tworzy okna, na których program może tworzyć obraz, oraz zajmuje się obsługą urządzeń wejściowych (myszki, klawiatury). Serwer X może rysować tylko najprostsze obiekty (odcinki, wielokąty, elipsy, wyświetlać bitmapy, pojedyncze piksele), nie dostarcza natomiast żadnego interfejsu użytkownika, czyli przycisków, rozwijanych menu, pasków przewijania itp. Rysowaniem i obsługą tych elementów musi zająć się program, najczęściej jest to biblioteka widgetów. System X nie zajmuje się również obsługą okien, nie dostarcza żadnych wbudowanych mechanizmów do ich przesuwania, zmiany rozmiaru, zamykania i uruchamiania programów, nie rysuje także pasków tytułowych dla okien – tym wszystkim musi zająć się osobny program, tzw. menedżer okien (Window Manager) lub jeszcze bardziej coś rozbudowanego tzn. środowisko graficzne (Desktop Environment).

Opcjonalnie można jeszcze doinstalować menedżera logowania (display manager lub login manager), bo bez niego X Window System odpala się w kontekście użytkownika, który zalogował się do konsoli tekstowej.

X Window System działa w architekturze klient-serwer, co oznacza, że składa się z dwóch elementów:
- serwera, zajmującego się wyświetlaniem grafiki oraz obsługą myszy i klawiatury,
- klienta, czyli oprogramowania żądającego od serwera zmian zawartości okna.
Nie ma znaczenia, czy oba elementy systemu działają na tym samym komputerze, czy na dwóch różnych maszynach. Jedna maszyna może wykonywać program, druga może wyświetlać wynik działania programu.

Wszystkie poniższe komendy były wydawane w systemie operacyjnym FreeBSD.

Instalacja X Window System - X.Org:

# pkg install xorg

Istnieją różne metody uruchomienia X-ów oraz aplikacji graficznych. Oto najbardziej prymitywna:

# X

lub

# Xorg

Uzyskamy czysty X Window System bez żadnego menedżera okien (czarny/szary ekran z kursorem myszy) - aplikacje odpalają się bez ramki, nie można zmieniać ich rozmiaru oraz przesuwać (ale działają!). Aplikacje odpalamy z dowolnej konsoli tekstowej np. [Ctrl+Alt+F2] w następujący sposób:

# xcalc -display :0

Można również odpalić czysty X Window System razem z terminalem xterm za pomocą polecenia:

# xinit

W systemie FreeBSD można uruchomić X Window System razem z domyślnym menedżerem okien TWM za pomocą poniższej komendy:

# startx

Mamy już zapewnioną obsługę okien.

Inne menedżery okien (lub całe środowiska graficzne) trzeba doinstalować. Na przykład FVWM:

# pkg install fvwm

Po instalacji menedżera okien FVWM, edytujemy plik ~/.xinitrc. Dodajemy wpis:

exec fvwm

Podsumowując, polecenie startx domyślnie uruchamia menedżera okien TWM lub inny menedżer okien (Window Manager) lub środowisko graficzne (Desktop Environment), gdy mamy odpowiedni wpis w pliku ~/.xinitrc.

Należało by wspomnieć, że rozbudowane środowiska graficzne np. XFCE, Gnome do prawidłowej pracy wymagają też odpowiednich wpisów w pliku /etc/rc.conf.

Przydatne "X-owe" programy, których nie trzeba doinstalowywać:

xcalc - kalkulator
xterm - terminal
xclock - zegar
xkill - zamyka okno graficzne (klienta)

Na koniec tego artykułu polecam książkę online: X Window System User's Guide.