INSTALL If your system doesn't have the capability of loading library dynamically, or should you wish to build a statically-linked executable on a system which can dynamically load libraries, run the command "make perl" instead of the usual command "make". USAGE First of all,you need to call constructor,namely new in Bench to create a "Bench" object (e.g. my $re=Bench->new()).Then you want to configurate it to make Bench meet your specific need. There are four recognized parameters:repeat, filesize, priority and concurrency to allow users to configurate, where 'repeat' is the default number of requests to make for each run, 'concurrency' is the concurrency level and 'filesize' is an default file size to hold the page contents, 'priority' is either "equal_opportunity" or "run_priority". Secondly, you need to add a run,which means a group of urls their correspoding postdata, cookie, filesize, repeat and order. The postdata is an array reference to a sequence of "big" postdata strings and cookie is a cookie strings, filesize is a integer idicating how big the returned file with contents gotten from the server should be. The default value is 16384 (16k ). Bench will accordingly ignore or assign empty string/s or take default value when necessary. To add a run, you call the method add. The argument of 'add' is a hash reference which accept the following keys: repeat, postdata , cookie, filesize and order,which is either "board_first" or "depth_first". (e.g. $re->add({"urls" => "http://localhost/"}). After having your desired configuration and runs added, call $re->execute to perform the requests, RETURN VALUE Bench returns a hash reference which has the key for each run, (keys as "run0", "run1", etc), besides "warn" and "total_time" and "bytes_received". Each run is again a hash, which has the keys for each url,besides "thread". The value stored in the key for each run is again a hash reference which has the following key/value pairs: "hostname" => a string of the url's hostname; "software" => a string of the server software; "path" => a string of the url's path; "port" => the port of the server; "doc_length" => the document length(amount of body read); "completed_requests" => the requests completed; "failed_requests" => requests failed; "total_read" => total amount bytes read from the server; "page_content" => the whole file read from the server; "header" => the header from the server; "max_connect_time" => the max time taken to connect this server among all our requests; "min_connect_time" => the min time taken to connect this server among all our requests; "max_time" => the max time taken to process and connect in total among our requests to this url; "min_time" => the min time taken to process and connect in total among our requests to this url; "average_connect_time" => the average time taken to connect this server for all the requests; "average_time" => the average time taken to process and connect this server for all the requests; if "POST" is used: "total_posted" => total amount posted to the server; The value stored in the key "threads" is an array reference which keeps information for each sequence of requests (that is, visit each of the urls once in order). Each entry of the array is a reference to a hash which has the following key/value pairs: "total_time" => an array reference, keeps how much time taken (process and connect) for each url in order for this thread; "connect_time" => an array reference,keeps how much time taken to connect each server in order for this thread; "page_content" => an array reference, keeps the contents read from the servers; "headers" => an array reference keeping the headers for every urls in the thread. The value stored in the key "warn" is a string containing the warn and error message generated by ab. The value stored in the key "total_time" is the total time taken for all our processs and connections in total. The value stored in the key "bytes_received" is the total bytes received from all the requests in total.