Include benchmarks directory.
[ocaml-bitstring.git] / benchmarks / parse_ext3_superblock.ml
1 (* Benchmark parsing of an ext3 superblock.
2  * $Id$
3  *)
4
5 open Printf
6
7 let bits = Bitstring.bitstring_of_file "examples/ext3_sb"
8
9 let parse () =
10   bitmatch bits with
11   | { s_inodes_count : 32 : littleendian;       (* Inodes count *)
12       s_blocks_count : 32 : littleendian;       (* Blocks count *)
13       s_r_blocks_count : 32 : littleendian;     (* Reserved blocks count *)
14       s_free_blocks_count : 32 : littleendian;  (* Free blocks count *)
15       s_free_inodes_count : 32 : littleendian;  (* Free inodes count *)
16       s_first_data_block : 32 : littleendian;   (* First Data Block *)
17       s_log_block_size : 32 : littleendian;     (* Block size *)
18       s_log_frag_size : 32 : littleendian;      (* Fragment size *)
19       s_blocks_per_group : 32 : littleendian;   (* # Blocks per group *)
20       s_frags_per_group : 32 : littleendian;    (* # Fragments per group *)
21       s_inodes_per_group : 32 : littleendian;   (* # Inodes per group *)
22       s_mtime : 32 : littleendian;              (* Mount time *)
23       s_wtime : 32 : littleendian;              (* Write time *)
24       s_mnt_count : 16 : littleendian;          (* Mount count *)
25       s_max_mnt_count : 16 : littleendian;      (* Maximal mount count *)
26       0xef53 : 16 : littleendian;               (* Magic signature *)
27       s_state : 16 : littleendian;              (* File system state *)
28       s_errors : 16 : littleendian;             (* Behaviour when detecting errors *)
29       s_minor_rev_level : 16 : littleendian;    (* minor revision level *)
30       s_lastcheck : 32 : littleendian;          (* time of last check *)
31       s_checkinterval : 32 : littleendian;      (* max. time between checks *)
32       s_creator_os : 32 : littleendian;         (* OS *)
33       s_rev_level : 32 : littleendian;          (* Revision level *)
34       s_def_resuid : 16 : littleendian;         (* Default uid for reserved blocks *)
35       s_def_resgid : 16 : littleendian;         (* Default gid for reserved blocks *)
36       s_first_ino : 32 : littleendian;          (* First non-reserved inode *)
37       s_inode_size : 16 : littleendian;         (* size of inode structure *)
38       s_block_group_nr : 16 : littleendian;     (* block group # of this superblock *)
39       s_feature_compat : 32 : littleendian;     (* compatible feature set *)
40       s_feature_incompat : 32 : littleendian;   (* incompatible feature set *)
41       s_feature_ro_compat : 32 : littleendian;  (* readonly-compatible feature set *)
42       s_uuid : 128 : string;                    (* 128-bit uuid for volume *)
43       s_volume_name : 128 : string;             (* volume name *)
44       s_last_mounted : 512 : string;            (* directory where last mounted *)
45       s_algorithm_usage_bitmap : 32 : littleendian; (* For compression *)
46       s_prealloc_blocks : 8;                    (* Nr of blocks to try to preallocate*)
47       s_prealloc_dir_blocks : 8;                (* Nr to preallocate for dirs *)
48       s_reserved_gdt_blocks : 16 : littleendian;(* Per group desc for online growth *)
49       s_journal_uuid : 128 : string;            (* uuid of journal superblock *)
50       s_journal_inum : 32 : littleendian;       (* inode number of journal file *)
51       s_journal_dev : 32 : littleendian;        (* device number of journal file *)
52       s_last_orphan : 32 : littleendian;        (* start of list of inodes to delete *)
53       s_hash_seed0 : 32 : littleendian;         (* HTREE hash seed *)
54       s_hash_seed1 : 32 : littleendian;
55       s_hash_seed2 : 32 : littleendian;
56       s_hash_seed3 : 32 : littleendian;
57       s_def_hash_version : 8;                   (* Default hash version to use *)
58       s_reserved_char_pad : 8;
59       s_reserved_word_pad : 16 : littleendian;
60       s_default_mount_opts : 32 : littleendian;
61       s_first_meta_bg : 32 : littleendian;      (* First metablock block group *)
62       _ : 6080 : bitstring } ->                 (* Padding to the end of the block *)
63
64       ()
65
66   | { _ } ->
67     eprintf "not an ext3 superblock!\n%!";
68     exit 2
69
70 let () =
71   for i = 0 to 2_000_000 do
72     parse ()
73   done