#include #include #include #include #include #include "snowflake/snowflake.h" #if defined(WIN32) #include "windows.h" #endif #define THREAD 2 #define TOTAL 50000 static snowflake snowf = {1, 0, 1, 6, 6, 0, 0, 2000}; static snowflake *flake = &snowf; uint64_t arr[TOTAL]; static uint64_t index = 0; uint64_t compar(const void *a, const void *b) { return (*(uint64_t *)a - *(uint64_t *)b); } uint64_t containsDuplicate() { uint32_t i, j; qsort(arr, TOTAL, sizeof(uint64_t), compar); for (i = 0, j = 1; j < TOTAL; i++, j++) { if (arr[i] > 0 && arr[j] > 0 && arr[i] == arr[j]) { return j; } } return 0; } void run() { for (int i = 0; i < TOTAL / THREAD; i++) { arr[__sync_fetch_and_add(&index, 1)] = NextId(flake); } } int main() { flake->Method = 1; Config(flake); pthread_t tid[THREAD]; struct timeval t_start, t_end; while (1) { // clock_gettime(CLOCK_REALTIME, &t_start); // for (int i = 0; i < THREAD; i++) // { // if (pthread_create(&tid[i], NULL, (void *)run, NULL) != 0) // { // printf("thread creation failed\n"); // exit(1); // } // } // for (int i = 0; i < THREAD; i++) // { // pthread_join(tid[i], NULL); //等待线程结束 // } // clock_gettime(CLOCK_REALTIME, &t_end); // printf("%d 线程 %s,总共:%d,%lf ms\n", THREAD, flake->Method == 1 ? "漂移" : "传统", index, (double)(t_end.tv_nsec - t_start.tv_nsec) / 1000000.0); // uint64_t re = containsDuplicate(); // if (re > 0) // { // printf("有重复数据:%ld,%ld\n", arr[re - 1], arr[re]); // } // else // { // printf("没有重复数据\n"); // } // for (int i = 0; i < TOTAL; i++) // { // arr[i] = 0; // } // index = 0; gettimeofday(&t_start, NULL); for (int i = 0; i < TOTAL; i++) { NextId(flake); } gettimeofday(&t_end, NULL); printf("单线程 %s,总共:%d,%lf ms\n", flake->Method == 1 ? "漂移" : "传统", TOTAL, (double)(t_end.tv_usec - t_start.tv_usec) / 1000.0); sleep(1); } return 1; }