roaring_bitmap_t *inplace_intersection(roaring_bitmap_t *bitmap1, roaring_bitmap_t *bitmap2) { roaring_bitmap_t *answer = roaring_bitmap_copy(bitmap1); roaring_bitmap_and_inplace(answer, bitmap2); return answer; }
int main(int argc, char **argv) { int c; char *extension = ".txt"; bool copy_on_write = false; while ((c = getopt(argc, argv, "e:h")) != -1) switch (c) { case 'e': extension = optarg; break; case 'h': printusage(argv[0]); return 0; default: abort(); } if (optind >= argc) { printusage(argv[0]); return -1; } char *dirname = argv[optind]; size_t count; size_t *howmany = NULL; uint32_t **numbers = read_all_integer_files(dirname, extension, &howmany, &count); if (numbers == NULL) { printf( "I could not find or load any data file with extension %s in " "directory %s.\n", extension, dirname); return -1; } uint64_t cycles_start = 0, cycles_final = 0; RDTSC_START(cycles_start); roaring_bitmap_t **bitmaps = create_all_bitmaps(howmany, numbers, count, copy_on_write); RDTSC_FINAL(cycles_final); if (bitmaps == NULL) return -1; printf("Loaded %d bitmaps from directory %s \n", (int)count, dirname); printf("Creating %zu bitmaps took %" PRIu64 " cycles\n", count, cycles_final - cycles_start); RDTSC_START(cycles_start); for (int i = 0; i < (int)count; i += 2) { roaring_bitmap_t *CI = roaring_bitmap_copy( bitmaps[i]); // to test the inplace version we create a copy roaring_bitmap_free(CI); } RDTSC_FINAL(cycles_final); printf("Copying and freeing %zu bitmaps took %" PRIu64 " cycles\n", count, cycles_final - cycles_start); uint64_t successive_and = 0; uint64_t successive_or = 0; // try ANDing and ORing together consecutive pairs for (int i = 0; i < (int)count - 1; ++i) { uint32_t c1 = roaring_bitmap_get_cardinality(bitmaps[i]); uint32_t c2 = roaring_bitmap_get_cardinality(bitmaps[i + 1]); RDTSC_START(cycles_start); roaring_bitmap_t *tempand = roaring_bitmap_and(bitmaps[i], bitmaps[i + 1]); RDTSC_FINAL(cycles_final); successive_and += cycles_final - cycles_start; uint32_t ci = roaring_bitmap_get_cardinality(tempand); roaring_bitmap_free(tempand); RDTSC_START(cycles_start); roaring_bitmap_t *tempor = roaring_bitmap_or(bitmaps[i], bitmaps[i + 1]); RDTSC_FINAL(cycles_final); successive_or += cycles_final - cycles_start; uint32_t co = roaring_bitmap_get_cardinality(tempor); roaring_bitmap_free(tempor); if (c1 + c2 != co + ci) { printf(KRED "cardinalities are wrong somehow\n"); printf("c1 = %d, c2 = %d, co = %d, ci = %d\n", c1, c2, co, ci); return -1; } } printf(" %zu successive bitmaps intersections took %" PRIu64 " cycles\n", count - 1, successive_and); printf(" %zu successive bitmaps unions took %" PRIu64 " cycles\n", count - 1, successive_or); roaring_bitmap_t **copyofr = malloc(sizeof(roaring_bitmap_t *) * count); for (int i = 0; i < (int)count; i++) { copyofr[i] = roaring_bitmap_copy(bitmaps[i]); } RDTSC_START(cycles_start); for (int i = 0; i < (int)count - 1; i++) { roaring_bitmap_and_inplace(copyofr[i], bitmaps[i + 1]); } RDTSC_FINAL(cycles_final); printf(" %zu successive in-place bitmaps intersections took %" PRIu64 " cycles\n", count - 1, cycles_final - cycles_start); free(copyofr); copyofr = malloc(sizeof(roaring_bitmap_t *) * count); for (int i = 0; i < (int)count; i++) { copyofr[i] = roaring_bitmap_copy(bitmaps[i]); } RDTSC_START(cycles_start); for (int i = 0; i < (int)count - 1; i++) { roaring_bitmap_or_inplace(copyofr[i], bitmaps[i + 1]); } RDTSC_FINAL(cycles_final); printf(" %zu successive in-place bitmaps unions took %" PRIu64 " cycles\n", count - 1, cycles_final - cycles_start); for (int i = 0; i < (int)count; ++i) { free(numbers[i]); numbers[i] = NULL; // paranoid roaring_bitmap_free(bitmaps[i]); bitmaps[i] = NULL; // paranoid } free(bitmaps); free(howmany); free(numbers); return 0; }