In C ist es schneller, die Standardbibliothek zu verwenden oder eine eigene Funktion zu schreiben?

8

Zum Beispiel gibt es in <ctype.h> Funktionen wie isalpha() .

Ich möchte wissen, ob das Schreiben einer isalpha -Funktion alleine schneller ist als das Aufrufen von isalpha ?

Danke für alle deine sofortigen Antworten! möchte nur meine Frage klarer machen:

Also sogar für die Isalpha-Funktion? weil Sie einfach ein Zeichen übergeben und prüfen können, ob das Zeichen zwischen 'a' und 'z' || steht 'A' und 'Z'?

eine andere Frage: Wenn Sie eine std-Bibliothek wie ctype.h einschließen und nur eine Funktion wie isalpha aufrufen, wird die Datei (ich meine alle Codezeilen) geladen? Meine Sorge ist, dass die große Größe Programm langsamer machen wird

    
draw 13.07.2010, 01:26
quelle

10 Antworten

65

Wenn Sie nicht einen bestimmten Grund dafür haben (z. B. wenn Sie die Standardbibliothek nicht verwenden möchten oder Sie einen sehr spezifischen Anwendungsfall profiliert haben, in dem Sie eine Funktion schreiben können, die besser abschneidet), sollten Sie dies immer bevorzugen eine Standardbibliotheksfunktion zu verwenden, wo eine existiert, anstatt eine eigene Funktion zu schreiben.

Die Funktionen der Standardbibliothek sind stark optimiert und sehr gut getestet. Darüber hinaus kann die Standardbibliothek, die mit Ihrem Compiler geliefert wird, Compiler-Intrinsics und andere Low-Level-Details nutzen, die Sie nicht portabel in Ihrem eigenen Code verwenden können.

    
James McNellis 13.07.2010, 01:28
quelle
14

isalpha prüft nicht nur, ob sein Argument in den Bereichen A-Z , a-z liegt. Zitieren des C-Standards (§7.4.1.2):

  

Die Isalpha-Funktion testet für alle   Zeichen für das isupper oder islower   ist wahr, oder irgendein Zeichen, das eins ist   eines Gebietsschema-spezifischen Alphabets   Zeichen für die keiner von iscntrl,   Isdigit, Ispunct oder Isspace ist wahr.

Sehr wahrscheinlich können Sie eine eingeschränktere Version schreiben (wie Sie vorschlagen), die für die Teilmenge der Fälle, die sie behandelt, schneller ist, aber nicht die Funktion isalpha . Bibliotheksroutinen existieren nicht nur, um effizient zu sein, sondern um vollständig und korrekt zu sein. Effizienz erweist sich tatsächlich als der einfache Teil; Wenn man alle Randfälle in Ordnung bringt, kommt die harte Arbeit ins Spiel.

Beachten Sie auch, wenn Sie eine optimierte Version schreiben, die auf Englisch / ASCII ausgerichtet ist, können Sie das effizienter tun, als Sie vorgeschlagen haben, entweder mit der von jemand anderen vorgeschlagenen Nachschlagetabelle oder mit meinen persönlichen Vorlieben (< em> editiert, um einen Fehler zu beheben, der von R. aufgefangen wurde. )

%Vor%     
Stephen Canon 13.07.2010 03:00
quelle
8

Im Allgemeinen sollten Sie nach Möglichkeit immer die C-Bibliotheken verwenden. Ein wirklicher Grund dafür ist nicht, wenn Sie sich in einer eingebetteten Umgebung befinden und EXTREM Speicherplatz begrenzt sind (was normalerweise nicht der Fall ist und praktisch alle eingebetteten Plattformen C-Bibliotheken für die Plattform bereitstellen).

Ein Beispiel könnte sein, dass die isalpha -Funktion tatsächlich eine Objektdatei mit allen is... -Funktionen hineinziehen kann und Sie keine davon benötigen (die Objektdatei ist die typische Mindesteinheit beim Verknüpfen obwohl Einige Linker können auf einzelne Funktionen zurückgreifen.)

Indem Sie Ihr eigenes isalpha schreiben, können Sie sicherstellen, dass es und nur es in Ihre endgültige Binärdatei eingebunden wird.

In einigen wenigen Fällen erhalten Sie möglicherweise höhere Geschwindigkeiten, wenn Sie eine ganz bestimmte Aufgabe haben und die Bibliothek einen allgemeineren Fall behandelt. Auch hier wird es nur benötigt, wenn eine bestimmte Schleife ein Flaschenhals im System ist. Möglicherweise möchten Sie auch einen anderen Kompromiss aus Geschwindigkeit und Platz wählen, als der Bibliotheksschreiber gewählt hat. Ein Beispiel ändert sich:

%Vor%

in:

%Vor%

eine (möglicherweise) schnellere Implementierung auf Kosten von zusätzlichem Speicher für die Karte (und Sie müssen Ihre Ausführungsumgebung verstehen, da sie nicht portierbar ist).

Ein weiterer Grund, sie nicht zu verwenden, besteht darin, einen sichereren Umgang mit Dingen wie Strings zu bieten, bei denen Sicherheit / Robustheit ein KRITISCHER Faktor ist. Dies kostet Sie in der Regel viel mehr Zeit, um die Korrektheit zu beweisen.

    
Keith Nicholas 13.07.2010 01:33
quelle
7

Die Standard-Bibliotheksfunktionen werden vermutlich von sehr schlauen Leuten geschrieben und gründlich geprüft, getestet und optimiert. Sie wurden vielleicht millionenfach in jeder erdenklichen Produktionsumgebung getestet. Die Chancen stehen gut, dass Ihre benutzerdefinierte Funktion nicht besser oder schneller ist.

    
Rob 13.07.2010 01:31
quelle
6

Es gibt bereits eine Reihe von Antworten hier, aber niemand außer Stephen Canons Adresse den wichtigsten Teil: die unterschiedliche Semantik. Dies ist der wichtigste Faktor bei der Auswahl der zu verwendenden Funktionen.

Die Funktionen der Standard-C-Bibliothek isalpha usw. werden entsprechend dem aktuellen Gebietsschema angegeben. Wenn Sie das Gebietsschema als Standard-Gebietsschema "C" belassen (indem Sie setlocale nicht aufrufen), haben sie ein sehr vorhersehbares Verhalten. Dies schließt jedoch die Verwendung der einzigen standardisierten Methode zur Erkennung und Verwendung der bevorzugten Zeichencodierung des Systems / Benutzers aus , Zahlenformatierung, Nachrichtensprache und andere Lokalisierungspräferenzen.

Wenn Sie andererseits Ihre eigene isalpha implementieren (die optimale Implementierung ist ((unsigned)c|32)-'a'<26 oder wenn Sie Code bevorzugen, der selbstdokumentierter ist, ((unsigned)c|('A'^'a')-'a'<='z'-'a' ), hat er unabhängig von der Ländereinstellung immer ein sehr vorhersehbares Verhalten.

Ich würde so weit gehen, ein als schädlich zu kennzeichnen, um die Standardfunktionen isalpha usw. für alles außer der naiven Textverarbeitung von Text zu verwenden, von dem angenommen wird, dass er im Gebietsschema des Benutzers ist. Diese Funktionen sind besonders ungeeignet für das Parsen von Konfigurationsdateien, textbasierten Netzwerktransaktionen, HTML, Programmiersprachenquellen usw. (Die einzige Ausnahme ist isdigit , die ISO C erfordert, um return (unsigned)c-'0'<10; zu entsprechen.) Am anderen Ende von Das Spektrum, wenn Sie eine Anwendung mit fortgeschrittener natürlicher Sprache Textverarbeitung schreiben (wie ein Textverarbeitungsprogramm oder Webbrowser) wird es viel fortgeschrittener Charakter Eigenschaft Handhabung als die C-Bibliothek bieten kann, und Sie sollten nach einem guten suchen Unicode-Bibliothek.

    
R.. 13.07.2010 05:47
quelle
2

Obwohl es wahrscheinlich nicht langsamer sein wird, wenn Sie es vorsichtig schreiben, kann ich fast garantieren, dass Sie nichts optimaler machen als das, was bereits da ist. Der einzige Fall, den ich mir vorstellen kann, ist, wenn es eine Funktion ist und Sie es wiederholt inline machen - aber wenn es ein Makro ist, werden Sie es nicht schlagen. Verwenden Sie den Standard.

    
eruciform 13.07.2010 01:29
quelle
1

In vielen C / C ++ Umgebungen (zB VisualC) steht die Quelle der 'C Runtime Library' (CRT) zur Verfügung. Sehen Sie sich den Code in der Funktion CRT an und versuchen Sie dann zu denken "Können Sie es besser machen?".

    
SteelBytes 13.07.2010 01:30
quelle
1

Die einzige Zeit, in der ich etwas in der Standardbibliothek nicht verwende, ist, wo etwas fehlt, es sei denn, eine bestimmte Erweiterung dieser Bibliothek ist eingeschaltet.

Um beispielsweise asprintf() in GNU C zu erhalten, müssen Sie _GNU_SOURCE vor dem Einbeziehen von <stdio.h> aktivieren. Es gab sogar eine Zeit, in der strdup() in <string.h> getroffen wurde.

Wenn ich stark von diesen Erweiterungen abhängig bin, versuche ich sie in meine Codebasis aufzunehmen, damit ich keine Kludges schreiben muss, um ihre Abwesenheit zu umgehen.

Dann gibt es die seltenen Fälle, wenn Sie Ihre eigene Version von etwas rollen möchten, das zum Beispiel POSIX-Verhalten (oder etwas anderes) auf eine bessere Weise gibt.

Abgesehen davon scheint etwas von stdc selbst etwas zu implementieren etwas albern zu sein, abgesehen von dem Wert, eine gute Lernübung zu sein.

    
Tim Post 13.07.2010 01:46
quelle
1

Interessanterweise ist die Implementierung von isalpha () in Ihrer Frage langsamer als die von C-Bibliotheken vor 30 Jahren am häufigsten verwendete Implementierung. Denken Sie daran, dies ist eine Funktion, die bei einer kritischen inneren Schleife Ihres durchschnittlichen C-Compilers verwendet wird. :)

Ich gebe zu, dass die derzeitigen Bibliotheksimplementierungen wahrscheinlich marginal langsamer sind als früher, weil wir Zeichensatzprobleme haben, mit denen wir heute zu tun haben.

    
Darron 13.07.2010 18:52
quelle
0

Einige Zeilen oder eine Zeile C-Code übersetzen sich nicht notwendigerweise in die einfachste und schnellste Lösung. ein memcpy von while (- len) * d ++ = * s ++; ist definitiv der langsamste. Die Bibliotheken sind im Allgemeinen gut gemacht und schnell, und es könnte schwierig werden, sie zu verbessern. Orte, auf denen Sie einen Gewinn sehen können, befinden sich auf bestimmten Plattformen, auf denen Sie etwas über die Plattform wissen, die der Compiler nicht hat. Zum Beispiel kann das Ziel ein 32-Bit-Prozessor sein, aber Sie wissen vielleicht, dass 64-Bit-ausgerichtete Zugriffe schneller sind und möglicherweise die Bibliothek modifizieren möchten, um diese spezielle Situation zu nutzen. Aber im Allgemeinen für alle Plattformen für alle Ziele werden Sie wahrscheinlich nicht besser tun, zielspezifische Optimierungen wurden für beliebte Ziele geschrieben und sind in der C-Bibliothek für die populären Compiler.

    
old_timer 13.07.2010 02:04
quelle

Tags und Links