30.Jan 2007
C-Funktionen mit PHP

Um in PHP C-Funktionen nutzen zu können, muss man diese in einer eigenen Extension verpacken. Dann können diese wie normale Funktionen aufgerufen werden. Dieser Weg ist etwas aufwendiger als in Python.

// myExt.c
#include "php.h"

PHP_FUNCTION(fibonacci)
{	
  int n;

  if ( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, 
    "l|l", &n ) == FAILURE ) 
    RETURN_NULL();

  RETURN_LONG(fibonacci(n));
}

int fibonacci( int n ) 
{
  if( n > 2 )
    return fibonacci( n - 1 ) + fibonacci( n - 2 );
  else
    return 1;
}

static function_entry myExt_functions[] = {
  PHP_FE(fibonacci, NULL)
  { NULL, NULL, NULL }
};

zend_module_entry myExt_module_entry = {
  STANDARD_MODULE_HEADER,
  "myExt", // Name der Extension
  myExt_functions,
  NULL, NULL, NULL, NULL, NULL,
  "1.0", // Version
  STANDARD_MODULE_PROPERTIES
};                                

ZEND_GET_MODULE(myExt)

Übersetzt wird die Extension mit den Kommandos

gcc -fpic -c `php-config --includes` myExt.c
gcc -shared myExt.o -o myExt.so

Um die Bibliothek einzubinden, kopiert man sie in das PHP Modulverzeichnis und ergäzt die php.ini um die Zeile extension=myExt.so. Zum Testen der Performanceunterschiede kann man folgendes PHP-Skript ausprobieren:

function php_fibonacci( $n )
{
  if ( $n > 2 ) 
    return php_fibonacci( $n - 2 ) + php_fibonacci( $n - 1 );
  else 
    return 1;
}

$t = time(); 
echo php_fibonacci(40); 
echo ":" . ( time() - $t ) . "\n";

$t = time(); 
echo fibonacci(40); 
echo ":" . ( time() - $t ) . "\n";

Auf meinem Testrechner benötigt die C-Variante dabei 2 Sekunden und das Skript ca. vier Minuten.


29.Jan 2007
C-Funktionen in Python

Für rechenintensive Vorgänge sind Skriptsprachen nicht immer performant genug. Python bietet über das ctypes-Paket einen komfortablen Weg, dynamische Bibliotheken einzubinden.

// fibonacci.c
int fibonacci( int n ) {
  if( n > 2 )
    return fibonacci( n - 1 ) + fibonacci( n - 2 );
  else 
    return 1;
}

Um den Quellcodes als Bibliothek zu übersetzen, dienen folgende Kommandos:

gcc -c -fpic fibonacci.c
gcc -shared fibonacci.o -o fibonacci.so

Zum direkten Performancevergleich habe ich die Fibonacci-Funktion zusätzlich in Python eingebunden.

# fibonaccy.py
def fibonacci( n ):
  if n > 2:
    return fibonacci( n - 1 ) + fibonacci( n - 2 )
  else: 
    return 1

# Python-Variante ausfuehren
print fibonacci(32); 

# C-Version einbinden und ausfuehren
import ctypes
DLib = ctypes.cdll.LoadLibrary( "fibonacci.so" )
print  DLib.fibonacci(32)

Zum Ausführen muss gegebenenfalls noch der Bibliothekspfad um das eigene Verzeichnis erweitert werden:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./fibonacci.py

22.Jan 2007
Glas mit eingebauten LEDs

Der Glashersteller Schott AG entwickelt mit LightPoints ein Glas mit eingebauten Leuchtdioden. Die Stromversorgung ist nahezu unsichtbar, und die LEDs lassen sich einzeln ansteuern. Auf den diesjährigen Kölner Passagen wurde auf der Grundlage dieses Materials eine schwebende Laufschrift präsentiert.

Schott LightPoints

18.Jan 2007
Compiler Cache – ccache

Das kleine Tool ccache verkuerzt die Zeiten fürs Kompilieren durch Cachen des Codes. Nach einen make clean muß nicht mehr der gesamte Quelltext übersetzt werden. Einfach als Alias mit alias cc=ccache cc oder als Umgebungsvariable mi CC=ccache cc einbinden. Zum Quellcode für den gcc.


17.Jan 2007
Gleichzeitiger Schreibzugriff auf eine Datei

Das Beschreiben z.B einer Logdatei mit einer in PHP geschriebenen Webanwendung ist nicht ungefährlich: tritt dabei eine race condition auf, kann auch eine mit flock() blockierte Datei leicht zerstoert werden. Die Lösung dieses Problems läuft über eine zusätzliche angelegten Lock-Datei:

function logData( $filename, $data )
{
  $lockhandle = fopen( $filename . ".lock", "w" );
		
  if( flock( $lockhandle, LOCK_EX + LOCK_NB ) ) {
    $filehandle = fopen( $filename, "a+" );
    fwrite( $filehandle, $data );
    fclose( $filehandle );
		
    flock( $lockhandle, LOCK_UN );
    fclose( $lockhandle );
		
    return true;
  }

  return false;
}

10.Jan 2007
Fyre

Fyre erstellt Bilder basierend auf Histogrammen iterierter, chaotischer Funktionen. Das Programm gibt es samt Quellcodes für Linux und Windows.

Fyre


8.Jan 2007
Museum of Tolerance and New Media

Gelungener Museumsentwurf von Jesper Bork aus Dänemark.

Museum of Tolerance, New York