<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Duff%E2%80%99s_Device</id>
	<title>Duff’s Device - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Duff%E2%80%99s_Device"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Duff%E2%80%99s_Device&amp;action=history"/>
	<updated>2026-06-06T06:50:20Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Duff%E2%80%99s_Device&amp;diff=624777&amp;oldid=prev</id>
		<title>imported&gt;SchlurcherBot: Bot: http → https</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Duff%E2%80%99s_Device&amp;diff=624777&amp;oldid=prev"/>
		<updated>2025-06-25T13:49:18Z</updated>

		<summary type="html">&lt;p&gt;Bot: http → https&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Duff’s Device&amp;#039;&amp;#039;&amp;#039; ist ein nach seinem Erfinder [[Tom Duff]] benanntes Programmierverfahren zum geschickten [[Loop unrolling|Abrollen von Schleifen]] ({{enS|&amp;#039;&amp;#039;loop unrolling&amp;#039;&amp;#039;}}) in der Programmiersprache [[C (Programmiersprache)|C]]. Es löst auf Code-sparende Weise das Problem, dass die Anzahl der Schleifendurchläufe evtl. kein Vielfaches der n-fach-Entrollung der Schleife ist oder die Anzahl an Durchläufen variabel ist und sich erst zur Laufzeit ergibt. Duff’s Device ist in jeder Programmiersprache anwendbar, die Einsprünge in den Schleifenkörper erlaubt.&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Duff arbeitete 1983 beim Filmproduktionsunternehmen [[Lucasfilm]] und stellte fest, dass die folgende Funktion zur Ausgabe von Bilddaten auf spezieller Hardware für seine Anwendung zu langsam lief:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Anmerkung, wegen vielfacher FALSCHER Änderung: Der Zeiger *to auf die Zieladresse wurde NICHT ebenfalls erhöht! Da kommt KEIN &amp;#039;++&amp;#039; hin. Siehe Quelle. --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
send(to, from, count)&lt;br /&gt;
register short *to, *from;&lt;br /&gt;
register count;&lt;br /&gt;
{&lt;br /&gt;
    do&lt;br /&gt;
        *to = *from++;&lt;br /&gt;
    while (--count&amp;gt;0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Duff störte, dass diese [[Implementierung#Softwaretechnik|Implementierung]] &amp;lt;!-- die Hälfte der // so nicht aus der Quelle zu entnehmen --&amp;gt;viel Zeit mit dem Prüfen der Schleifenbedingung verbrachte.&lt;br /&gt;
Das Standardverfahren, um die Ausführungsgeschwindigkeit von Schleifen zu erhöhen, besteht darin, sie abzurollen. Dabei bleibt jedoch ein partieller Durchlauf übrig. Aus der Assembler-Programmierung kannte Duff die&amp;lt;!-- übliche Technik // TF --&amp;gt; Möglichkeit, direkt in die Schleife hineinzuspringen. In der Programmiersprache C kann dies mithilfe der Switch-Anweisung gelöst werden:&amp;lt;ref name=&amp;quot;duff83&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
send(to, from, count)&lt;br /&gt;
register short *to, *from;&lt;br /&gt;
register count;&lt;br /&gt;
{&lt;br /&gt;
    register n = (count+7)/8;&lt;br /&gt;
    switch (count%8) {&lt;br /&gt;
        case 0:	do {    *to = *from++;&lt;br /&gt;
        case 7:         *to = *from++;&lt;br /&gt;
        case 6:         *to = *from++;&lt;br /&gt;
        case 5:         *to = *from++;&lt;br /&gt;
        case 4:         *to = *from++;&lt;br /&gt;
        case 3:         *to = *from++;&lt;br /&gt;
        case 2:         *to = *from++;&lt;br /&gt;
        case 1:         *to = *from++;&lt;br /&gt;
        } while (--n&amp;gt;0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erklärung ===&lt;br /&gt;
&lt;br /&gt;
Die Funktion erhält beim Aufruf die Adressen eines Ausgaberegisters (&amp;lt;code&amp;gt;*to&amp;lt;/code&amp;gt;) und eines Arrays im Speicher (&amp;lt;code&amp;gt;*from&amp;lt;/code&amp;gt;) und die Anzahl der zu übertragenden Daten (&amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt; steht meist für zwei Bytes) übergeben. Sie verwendet ein &amp;#039;&amp;#039;loop unrolling&amp;#039;&amp;#039;, bei dem jeweils acht Elemente ausgerollt werden.&amp;lt;ref&amp;gt;[http://www.catb.org/jargon/html/D/Duffs-device.html Eintrag &amp;#039;&amp;#039;Duff’s Device&amp;#039;&amp;#039;] im [[Jargon File]] auf catb.org &amp;#039;&amp;#039;(englisch)&amp;#039;&amp;#039;&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;duff83&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zählvariable &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; enthält die Anzahl der Schleifendurchläufe (&amp;lt;code&amp;gt;count/8&amp;lt;/code&amp;gt;, aufgerundet). Ist &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;kein&amp;#039;&amp;#039;&amp;#039; Vielfaches von acht, so wird beim ersten Durchlauf über die [[Bedingte Anweisung und Verzweigung#Mehrfache Verzweigung|Switch-Anweisung]] ein Teil der Schleife übersprungen und nur &amp;lt;code&amp;gt;Rest(count div 8)&amp;lt;/code&amp;gt; Elemente kopiert. Ab dem zweiten Durchlauf &amp;#039;&amp;#039;&amp;#039;ist&amp;#039;&amp;#039;&amp;#039; die Anzahl der noch zu kopierenden Elemente dann ein Vielfaches von acht. Anschließend wird immer der gesamte Schleifenrumpf durchlaufen und jeweils acht Elemente am Stück verarbeitet.&lt;br /&gt;
&lt;br /&gt;
== Nachteile ==&lt;br /&gt;
&lt;br /&gt;
Auf modernen Prozessoren führt diese Methode nicht notwendigerweise zu einer Effizienzsteigerung, da sie sich negativ auf das [[Cache]]-Verhalten auswirken kann. Moderne Compiler verwenden selbst Verfahren zum Abrollen von Programmierschleifen, wobei sie die jeweilige Zielplattform berücksichtigen. Zudem kann der Code durch häufige Anwendungen der Methode extrem vergrößert werden.&amp;lt;ref&amp;gt;[[Theodore Ts’o]] zu [https://lkml.indiana.edu/hypermail/linux/kernel/0008.2/0171.html XFree86 und Performance] im Linux Kernel Archive auf lkml.indiana.edu &amp;#039;&amp;#039;(englisch)&amp;#039;&amp;#039;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [[Brian W. Kernighan]], [[Dennis Ritchie]]: &amp;#039;&amp;#039;The C Programming Language.&amp;#039;&amp;#039; 2. Auflage. Prentice Hall, 1988, ISBN 81-203-0596-5.&lt;br /&gt;
* [[Bjarne Stroustrup]]: &amp;#039;&amp;#039;The C++ Programming Language.&amp;#039;&amp;#039; 3. Auflage. Addison-Wesley, 1997, ISBN 0-201-88954-4.&lt;br /&gt;
* [[British Standards Institution]] (Hrsg.): &amp;#039;&amp;#039;The C Standard – Incorporating TC1 – BS ISO/IEC 9899:1999&amp;#039;&amp;#039;. John Wiley &amp;amp; Sons, 2003, ISBN 0-470-84573-2.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;duff83&amp;quot;&amp;gt;&lt;br /&gt;
[https://www.lysator.liu.se/c/duffs-device.html &amp;#039;&amp;#039;Tom Duff on Duff’s Device&amp;#039;&amp;#039;] auf lysator.liu.se (englisch)&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Duffs Device}}&lt;br /&gt;
[[Kategorie:C (Programmiersprache)]]&lt;br /&gt;
[[Kategorie:C++]]&lt;/div&gt;</summary>
		<author><name>imported&gt;SchlurcherBot</name></author>
	</entry>
</feed>