উভয়ই 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;
}
এই পদ্ধতিটি লাইব্রেরি ব্যবহারের চেয়ে অনেক দ্রুততর যা চিত্রের আকার পেতে পিএনজি ফরোয়ার্ড, পেছনের দিকে এবং পাশের রাস্তাগুলি লোড করে দেয়: পি (অবশ্যই অবশ্যই নির্বিচারে পিএনজি পূর্ণ একটি ডিরেক্টরিকে খাওয়ানোর আগে কোডটি সাবধানতার সাথে বিবেচনা করুন।)
কোড ব্যবহারের জন্য inet.h htonl () অব- করার endian -ize হেডার বাইট ক্রম।