ทั้งสอง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 ข้าง, ข้างหลังและด้านข้างเพียงเพื่อให้ได้ขนาดภาพ: (. พิจารณารหัสรอบคอบก่อนที่จะให้อาหารมันไดเรกทอรีเต็มรูปแบบของ PNGs โดยพลการของหลักสูตร) P
การใช้รหัส inet.h สำหรับhtonl ()เพื่อ de- endian -ize ไบต์สั่งซื้อหัว