xcb與x11的比較:時間比較
阿新 • • 發佈:2019-01-04
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/time.h> #include <xcb/xcb.h> #include <X11/Xlib.h> double get_time(void) { struct timeval timev; gettimeofday(&timev, NULL); return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000); } int main () { xcb_connection_t *c; xcb_atom_t *atoms; xcb_intern_atom_cookie_t *cs; char **names; int count; int i; double start; double end; double diff; /* Xlib */ Display *disp; Atom *atoms_x; double diff_x; c = xcb_connect (NULL, NULL); count = 500; atoms = (xcb_atom_t *)malloc (count * sizeof (atoms)); names = (char **)malloc (count * sizeof (char *)); /* init names */ for (i = 0; i < count; ++i) { char buf[100]; sprintf (buf, "NAME%d", i); names[i] = strdup (buf); } /* bad use */ start = get_time (); for (i = 0; i < count; ++i) atoms[i] = xcb_intern_atom_reply (c, xcb_intern_atom (c, 0, strlen(names[i]), names[i]), NULL)->atom; end = get_time (); diff = end - start; printf ("bad use time : %f\n", diff); /* good use */ start = get_time (); cs = (xcb_intern_atom_cookie_t *) malloc (count * sizeof(xcb_intern_atom_cookie_t)); for(i = 0; i < count; ++i) cs[i] = xcb_intern_atom (c, 0, strlen(names[i]), names[i]); for(i = 0; i < count; ++i) { xcb_intern_atom_reply_t *r; r = xcb_intern_atom_reply(c, cs[i], 0); if(r) atoms[i] = r->atom; free(r); } end = get_time (); printf ("good use time : %f\n", end - start); printf ("ratio : %f\n", diff / (end - start)); diff = end - start; /* free var */ free (atoms); free (cs); xcb_disconnect (c); /* Xlib */ disp = XOpenDisplay (getenv("DISPLAY")); atoms_x = (Atom *)malloc (count * sizeof (atoms_x)); start = get_time (); for (i = 0; i < count; ++i) atoms_x[i] = XInternAtom(disp, names[i], 0); end = get_time (); diff_x = end - start; printf ("Xlib use time : %f\n", diff_x); printf ("ratio : %f\n", diff_x / diff); free (atoms_x); for (i = 0; i < count; ++i) free (names[i]); free (names); XCloseDisplay (disp); return 0; }