Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2014
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.17 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <limits.h>
  4.  
  5. typedef unsigned char byte;
  6.  
  7. byte *pool, *pool_ptr, *helper, *helper_ptr;
  8. size_t pool_size, left_space;
  9. const byte SIZE_MARK_MAX = UCHAR_MAX >> 1;
  10.  
  11. void use_mj_allocator(size_t size)
  12. {
  13. pool = pool_ptr = (byte *)malloc(size);
  14. helper = helper_ptr = (byte *)calloc(size, 1);
  15. pool_size = left_space = size;
  16. }
  17.  
  18. void free_mj_allocator()
  19. {
  20. free(pool);
  21. free(helper);
  22. }
  23.  
  24. void set_size_mark(size_t size, byte *ptr)
  25. {
  26. if (size <= SIZE_MARK_MAX)
  27. {
  28. *ptr = (size << 1) + 1;
  29. }
  30. else
  31. {
  32. *ptr = 2;
  33. *(size_t *)(ptr + 1) = size;
  34. }
  35. }
  36.  
  37. size_t get_size_mark(const byte *ptr)
  38. {
  39. if (*ptr & 1)
  40. {
  41. return *ptr >> 1;
  42. }
  43. return *(size_t *)(ptr + 1);
  44. }
  45.  
  46. int search(size_t size)
  47. {
  48. if (size > pool_size)
  49. {
  50. return 0;
  51. }
  52. byte *start_ptr = helper_ptr;
  53. if (left_space == 0)
  54. {
  55. goto no_left_space;
  56. }
  57. helper_ptr += left_space;
  58. left_space = 0;
  59. while (1)
  60. {
  61. if (helper_ptr == start_ptr)
  62. {
  63. return 0;
  64. }
  65. no_left_space:
  66. if (helper_ptr == helper + pool_size)
  67. {
  68. helper_ptr = helper;
  69. left_space = 0;
  70. }
  71. if (*helper_ptr)
  72. {
  73. left_space = 0;
  74. helper_ptr += get_size_mark(helper_ptr);
  75. }
  76. else
  77. {
  78. ++left_space;
  79. ++helper_ptr;
  80. }
  81. if (left_space == size)
  82. {
  83. while (1)
  84. {
  85. if (helper_ptr == helper + pool_size || *helper_ptr)
  86. {
  87. break;
  88. }
  89. ++left_space;
  90. ++helper_ptr;
  91. }
  92. break;
  93. }
  94. }
  95. helper_ptr -= left_space;
  96. pool_ptr = helper_ptr - helper + pool;
  97. return 1;
  98. }
  99.  
  100. void *mj_malloc(size_t size)
  101. {
  102. if (size > left_space)
  103. {
  104. if (!search(size))
  105. {
  106. return NULL;
  107. }
  108. }
  109. set_size_mark(size, helper_ptr);
  110. byte *ptr = pool_ptr;
  111. pool_ptr += size;
  112. helper_ptr += size;
  113. left_space -= size;
  114. return ptr;
  115. }
  116.  
  117. void *mj_calloc(size_t len, size_t unit)
  118. {
  119. size_t size = len * unit;
  120. void *ptr = mj_malloc(size);
  121. memset(ptr, 0, size);
  122. return ptr;
  123. }
  124.  
  125. void mj_free(void *ptr)
  126. {
  127. byte *temp_helper_ptr = (byte *)ptr - pool + helper;
  128. if (*temp_helper_ptr & 1)
  129. {
  130. *temp_helper_ptr = 0;
  131. }
  132. else
  133. {
  134. memset(temp_helper_ptr, 0, sizeof(size_t) + 1);
  135. }
  136. }
  137.  
  138. size_t kb_to_b(size_t kb)
  139. {
  140. return 1000 * kb;
  141. }
  142.  
  143. size_t mb_to_b(size_t mb)
  144. {
  145. return kb_to_b(1000 * mb);
  146. }
  147.  
  148. size_t gb_to_b(size_t gb)
  149. {
  150. return mb_to_b(1000 * gb);
  151. }
  152.  
  153. #ifndef MJ_ALLOCATOR_H
  154. #define MJ_ALLOCATOR_H
  155.  
  156. #include <stddef.h>
  157.  
  158. #define malloc mj_malloc
  159. #define calloc mj_calloc
  160. #define free mj_free
  161.  
  162. void use_mj_allocator(size_t size);
  163. void free_mj_allocator();
  164. void *mj_malloc(size_t size);
  165. void *mj_calloc(size_t len, size_t unit);
  166. void mj_free(void *ptr);
  167. size_t kb_to_b(size_t kb);
  168. size_t mb_to_b(size_t mb);
  169. size_t gb_to_b(size_t gb);
  170.  
  171. #endif
  172.  
  173. #include <stdio.h>
  174. #include <stdlib.h>
  175. #include <time.h>
  176.  
  177. #ifdef MJ_ALLOCATOR
  178. #include "mj_allocator.h"
  179. #endif
  180.  
  181. enum {ARRAY_LEN = 50000};
  182. int *array[ARRAY_LEN];
  183. long long sum = 0;
  184.  
  185. int confuse_the_compiler(int n)
  186. {
  187. return n % 10 > 5 ? -n / 2 : n * 2;
  188. }
  189.  
  190. void start()
  191. {
  192. for (int i = 1; i <= ARRAY_LEN; ++i)
  193. {
  194. for (int j = 0; j < i; ++j)
  195. {
  196. array[j] = (int *)malloc(sizeof(int));
  197. array[j][0] = j + 1;
  198. }
  199. for (int j = i - 1; j >= 0; --j)
  200. {
  201. sum -= j;
  202. int n = confuse_the_compiler(array[j][0]);
  203. if (n != 0)
  204. {
  205. sum += n;
  206. free(array[j]);
  207. }
  208. }
  209. }
  210. }
  211.  
  212. int main()
  213. {
  214.  
  215. #ifdef MJ_ALLOCATOR
  216. use_mj_allocator(ARRAY_LEN * sizeof(int));
  217. #endif
  218.  
  219. time_t start_time = clock();
  220. start();
  221. time_t end_time = clock();
  222. printf("nelapsed time: %.3fn", (double)(end_time - start_time) / CLOCKS_PER_SEC);
  223. printf("%lld", sum);
  224.  
  225. #ifdef MJ_ALLOCATOR
  226. free_mj_allocator();
  227. #endif
  228.  
  229. return 0;
  230. }
  231.  
  232. class test
  233. {
  234. final static int ARRAY_LEN = 50000;
  235. static int[][] array;
  236. static long sum = 0;
  237.  
  238. static int confuse_the_compiler(int n)
  239. {
  240. return n % 10 > 5 ? -n / 2 : n * 2;
  241. }
  242.  
  243. static void start()
  244. {
  245. for (int i = 1; i <= ARRAY_LEN; ++i)
  246. {
  247. for (int j = 0; j < i; ++j)
  248. {
  249. array[j] = new int[1];
  250. array[j][0] = j + 1;
  251. }
  252. for (int j = i - 1; j >= 0; --j)
  253. {
  254. sum -= j;
  255. int n = confuse_the_compiler(array[j][0]);
  256. if (n != 0)
  257. {
  258. sum += n;
  259. // free(array[j]);
  260. }
  261. }
  262. }
  263. }
  264.  
  265. public static void main(String[] args)
  266. {
  267. array = new int[ARRAY_LEN][];
  268. long start_time = System.currentTimeMillis();
  269. start();
  270. System.gc();
  271. long end_time = System.currentTimeMillis();
  272. System.out.printf("nelapsed time: %.3fn", (end_time - start_time) / 1000.0);
  273. System.out.println(sum);
  274. }
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement