दोनों display
और file
काफी धीमी गति से कर रहे हैं, और कई एक से अधिक फ़ाइलों के साथ काम कर अपने घुटनों के लिए भी काफी सक्षम सिस्टम लाने के लिए क्षमता है। एक छोटा परीक्षण:
$ du -h *.png --total | tail -n 1
9.2M total
$ ls -l *.png | wc -l
107
$ /usr/bin/time file *.png
--> 0.37user 0.26system 0:06.93elapsed 9%CPU (0avgtext+0avgdata 37232maxresident)k
22624inputs+0outputs (9major+2883minor)pagefaults 0swaps
$ /usr/bin/time identify *.png
--> 0.56user 0.22system 0:06.77elapsed 11%CPU (0avgtext+0avgdata 25648maxresident)k
34256inputs+0outputs (119major+2115minor)pagefaults 0swaps
केवल आवश्यक बाइट्स पढ़ने से, इस ऑपरेशन को महत्वपूर्ण रूप से समाप्त किया जा सकता है।
$ /usr/bin/time ./pngsize *.png
--> 0.00user 0.00system 0:00.03elapsed 12%CPU (0avgtext+0avgdata 1904maxresident)k
0inputs+0outputs (0major+160minor)pagefaults 0swaps
यहाँ pngsize है:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <err.h>
#define oops(syscall) { printf("error processing %s: ", argv[i]); \
fflush(0); perror(syscall"()"); continue; }
int main(int argc, char **argv) {
int fd, i;
uint32_t h, w;
if (argc < 2) { printf("%s <pngfile> [pngfile ...]\n", argv[0]); exit(0); }
for (i = 1; i < argc; i++) {
if (argc > 2) printf("%s: ", argv[i]);
if ((fd = open(argv[i], O_RDONLY)) == -1) oops("open");
if (lseek(fd, 16, SEEK_SET) == -1) oops("lseek");
if (read(fd, &w, 4) < 1) oops("read");
if (read(fd, &h, 4) < 1) oops("read");
printf("%dx%d\n", htonl(w), htonl(h));
if (close(fd) == -1) oops("close");
}
return 0;
}
यह विधि एक पुस्तकालय का उपयोग करने की तुलना में बहुत तेज है जो PNG को आगे, पीछे और बग़ल में लोड करता है बस छवि का आकार प्राप्त करने के लिए: P (कोड को ध्यान से देखें, यह निश्चित रूप से पीएनजी से भरा एक निर्देशिका को खिलाने से पहले।)
कोड inet.h का उपयोग करता है htonl () के लिए , हेडर बाइट ऑर्डर को डी- एंडियन करें ।