<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Latest posts for the topic "Stress Test"]]></title>
		<link>http://s4j.mentaframework.org/posts/list/2.page</link>
		<description><![CDATA[Latest messages posted in the topic "Stress Test"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Stress Test</title>
				<description><![CDATA[ To prove how fast and highly multithreaded Space4J is, we implemented a stress test program that creates many threads to perform insertion, deletion, search and iteration at the same time in the same indexed Java collection in memory.<br /> <br /> You can download the [i]PhoneBookStress.java[/i] program by [url="http://www.space4j.org/examples/PhoneBookStress.java"]clicking here[/url]. The source code is also listed below. (Note that to compile and run this problem you must include the space4.jar in the classpath)<br /> <br /> The arguments you must pass to the program are:<br /> <br /> :arrow: number of insert threads<br /> :arrow: number of delete threads<br /> :arrow: number of select threads<br /> :arrow: number of search threads<br /> :arrow: thread sleep time = how long each thread will sleep after each action<br /> :arrow: collection initial size = how many elements should the collection has before the threads start<br /> :arrow: snapshot time = how often should we take a snapshot<br /> <br /> After executing the program for some time, hit CTRL+C to print the statistics. Here is an example:<br /> [code]<br /> java -cp .;space4j.jar org.space4j.examples.phonebook.PhoneBookStress 5 4 10 5 50 2000 1000<br /> ...<br /> ...<br /> ...<br /> Found 29 recods!<br /> Found 28 recods!<br /> Found 27 recods!<br /> Selected 302 records!<br /> Selected 302 records!<br /> Found 20 recods!<br /> Selected 302 records!<br /> Found 22 recods!<br /> =============================&gt; Snapshot Complete!<br /> Deleted record number 575<br /> Deleted record number 1224<br /> Deleted record number 675<br /> Inserted record number 3020<br /> Inserted record number 3019<br /> Inserted record number 3018<br /> Deleted record number 575<br /> Inserted record number 3017<br /> Inserted record number 3021<br /> <br /> <br /> ========== Results:<br /> Inserted = 60<br /> Deleted  = 54<br /> Selected = 79426<br /> Searched = 2867<br /> Snapshots=6<br /> Time: 1375 ms<br /> [/code]<br /> <br /> The source code of the [i]PhoneBookStress.java[/i] program:<br /> [code]<br /> package org.space4j.examples.phonebook;<br /> <br /> <br /> import java.util.Collection;<br /> import java.util.Iterator;<br /> import java.util.Random;<br /> <br /> import org.space4j.Space4J;<br /> import org.space4j.implementation.SimpleSpace4J;<br /> <br /> <br /> public class PhoneBookStress extends PhoneBookIndexing {<br /> 	<br />     private final Thread[] insertThread;<br /> 	<br />     private final Thread[] deleteThread;<br /> 	<br />     private final Thread[] selectThread;<br /> 	<br />     private final Thread[] searchThread;<br /> 	<br />     private final Thread snapshotThread;<br />     <br />     private Random rand = new Random();<br />     <br />     private volatile long totalInserted = 0;<br />     private volatile long totalDeleted = 0;<br />     private volatile long totalSelected = 0;<br />     private volatile long totalSearched = 0;<br />     private volatile long snapshotsTaken = 0;<br />     <br />     private long started;<br />     <br />     private volatile boolean running = true;<br /> 	<br />     public PhoneBookStress(Space4J space4j, final int nInsert, final int nDelete, final int nSelect, final int nSearch,<br />             final int sleepTime, final int tableSize, final int snapshotTime) throws Exception {<br /> 		<br />         super(space4j);<br /> 		<br />         // populate the table if needed...<br /> 		<br />         int size = users.size();<br /> 		<br />         if (size &lt; tableSize) {<br /> 			<br />             int diff = tableSize - size;<br /> 			<br />             for (int i = 0; i &lt; diff; i++) {<br /> 				<br />                 insertRandom();<br /> 				<br />                 System.out.print("\rInserting " + i + "...                 ");<br />             }<br />         }<br /> 		<br />         System.out.println();<br /> 		<br />         insertThread = new Thread[nInsert];<br /> 		<br />         deleteThread = new Thread[nDelete];<br /> 		<br />         selectThread = new Thread[nSelect];<br /> 		<br />         searchThread = new Thread[nSearch];<br /> 		                         <br />         for (int i = 0; i &lt; nInsert; i++) {<br />             insertThread[i] = new Thread(new Runnable() {<br /> 			<br />                 public void run() {<br /> 				<br />                     while (running) {<br /> 					<br />                         try {<br /> 						<br />                             Thread.sleep(sleepTime);<br /> 						<br />                             handleInsert();<br /> 						<br />                         } catch (Exception e) {<br /> 						<br />                             return;<br />                         }<br />                     }<br />                 }<br /> 			<br />             });<br />         }<br /> 		<br />         for (int i = 0; i &lt; nDelete; i++) {<br />             deleteThread[i] = new Thread(new Runnable() {<br /> 			<br />                 public void run() {<br /> 				<br />                     while (running) {<br /> 					<br />                         try {<br /> 						<br />                             Thread.sleep(sleepTime);<br /> 						<br />                             handleDelete();<br /> 						<br />                         } catch (Exception e) {<br /> 						<br />                             return;<br />                         }<br />                     }<br />                 }<br /> 			<br />             });<br />         }<br /> 		<br />         for (int i = 0; i &lt; nSelect; i++) {<br />             selectThread[i] = new Thread(new Runnable() {<br /> 			<br />                 public void run() {<br /> 				<br />                     while (running) {<br /> 					<br />                         try {<br /> 						<br />                             Thread.sleep(sleepTime);<br /> 						<br />                             handleSelect();<br /> 						<br />                         } catch (Exception e) {<br /> 						<br />                             return;<br />                         }<br />                     }<br />                 }<br /> 			<br />             });<br />         }<br /> 		<br />         for (int i = 0; i &lt; nSearch; i++) {<br />             searchThread[i] = new Thread(new Runnable() {<br /> 			<br />                 public void run() {<br /> 				<br />                     while (running) {<br /> 					<br />                         try {<br /> 						<br />                             Thread.sleep(sleepTime);<br /> 						<br />                             handleSearch();<br /> 						<br />                         } catch (Exception e) {<br /> 						<br />                             return;<br />                         }<br />                     }<br />                 }<br /> 			<br />             });<br />         }<br /> 		<br />         snapshotThread = new Thread(<br />                 new Runnable() {<br /> 			<br />             public void run() {<br /> 				<br />                 while (running) {<br /> 					<br />                     try {<br /> 						<br />                         Thread.sleep(snapshotTime);<br /> 						<br />                         System.out.println("Executing snapshot...");<br /> 						<br />                         PhoneBookStress.this.executeSnapshot();<br /> 						<br />                         System.out.println(<br />                                 "=============================&gt; Snapshot Complete!");<br />                         <br />                         snapshotsTaken++;<br /> 						<br />                     } catch (Exception e) {<br /> 						<br />                         return;<br />                     }<br />                 }<br />             }<br /> 			<br />         });		<br />     }<br /> 	<br />     public void start() {<br /> 		<br />         for (int i = 0; i &lt; insertThread.length; i++) {<br />             insertThread[i].start();<br />         }<br /> 		<br />         for (int i = 0; i &lt; deleteThread.length; i++) {<br />             deleteThread[i].start();<br />         }<br /> 		<br />         for (int i = 0; i &lt; selectThread.length; i++) {<br />             selectThread[i].start();<br />         }<br /> 		<br />         for (int i = 0; i &lt; searchThread.length; i++) {<br />             searchThread[i].start();<br />         }<br /> 		<br />         snapshotThread.start();<br />     }<br /> 	<br />     protected int insertRandom() throws Exception {<br />     	<br />     	// insert a random phone number...<br /> 		<br />         StringBuilder sb = new StringBuilder();<br />         <br />         sb.append("Oliveira").append(rand.nextInt(100) + 1);<br /> 		<br />         return this.addNumber("Sergio", sb.toString(), "123-4321", rand.nextInt(100) + 1);<br />     }<br /> 	<br />     protected int deleteRandom() throws Exception {<br />     	<br />     	// delete a random phone number<br />     	// (guess a number, iterate to choose a phone and delete it) <br /> <br />         Iterator iter = users.keySet().iterator();<br /> 		<br />         int count = rand.nextInt(users.size() / 10) + 1;<br /> 		<br />         int index = 0;<br /> 		<br />         int id = -1;<br /> 		<br />         while (iter.hasNext() && index++ &lt;= count) {<br /> 			<br />             id = (Integer) iter.next();<br /> 			<br />         }<br /> 		<br />         if (id &gt; 0) {<br /> 			<br />             this.delUser(id);<br /> 			<br />         }<br /> 		<br />         return id;<br />     }<br /> 	<br />     private void handleInsert() throws Exception {<br /> 		<br />         int id = insertRandom();<br /> 		<br />         System.out.println("Inserted record number " + id);<br />         <br />         totalInserted++;<br />     }<br /> 	<br />     private void handleDelete() throws Exception {<br /> 		<br />         int id = deleteRandom();<br /> 		<br />         if (id == -1) {<br /> 			<br />             System.out.println("Could not delete anything!");<br /> 			<br />         } else {<br /> 			<br />             System.out.println("Deleted record number " + id);<br />             <br />             totalDeleted++;<br />         }<br />     }<br /> 	<br />     private void handleSelect() {<br />     	<br />     	// select any 300 phone numbers and loop through them...<br /> 		<br />         Iterator iter = users.values().iterator();<br /> 		<br />         int count = 0;<br /> 		<br />         while (iter.hasNext() && count++ &lt;= 300) {<br /> 			<br />             iter.next();<br />         }<br /> 		<br />         System.out.println("Selected " + count + " records!");<br />         <br />         totalSelected += count;<br />     }<br /> <br />     private void handleSearch() {<br />     	<br />     	// choose a user and try to find his phone number...<br />     	<br />     	StringBuilder sb= new StringBuilder();<br /> 		<br />         sb.append("Oliveira").append(rand.nextInt(100) + 1);<br /> 		<br />         Collection coll = this.findUsers(sb.toString());<br /> 		<br />         int count = 0;<br /> 		<br />         Iterator iter = coll.iterator();<br /> 		<br />         while (iter.hasNext()) {<br /> 			<br />             count++;<br /> 			<br />             iter.next();<br />         }<br /> 		<br />         System.out.println("Found " + count + " recods!");<br />         <br />         totalSearched += count;<br /> 		<br />     }<br />     <br />     private void interruptAll() {<br />     	<br />     	for(int i=0;i&lt;insertThread.length;i++) insertThread[i].interrupt();<br />     	<br />     	for(int i=0;i&lt;deleteThread.length;i++) deleteThread[i].interrupt();<br />     	<br />     	for(int i=0;i&lt;selectThread.length;i++) selectThread[i].interrupt();<br />     	<br />     	for(int i=0;i&lt;searchThread.length;i++) searchThread[i].interrupt();<br />     }<br /> 	<br />     public static void main(String[] args) throws Exception {<br /> 		<br />         if (args.length &gt;= 1) {<br /> 			<br />             if (args[0].equals("-nostress")) {<br /> 				<br />                 PhoneBook book = new PhoneBook(new SimpleSpace4J("PhoneBook"));<br /> 				<br />                 run(book);<br /> 				<br />                 return;<br />             }<br /> 				<br />         }<br /> 		<br />         if (args.length != 7) {<br /> 			<br />             System.out.println(<br />                     "format: java PhoneBookStress [-nostress] &lt;number of insert threads&gt; &lt;number of delete threads&gt; "<br />                             + "&lt;number of select threads&gt; &lt;number of search threads&gt; &lt;thread sleep time&gt; &lt;collection initial size&gt; &lt;snapshot time&gt;");<br /> 			<br />             return;<br />         }<br /> 		<br />         int nInsert, nDelete, nSelect, nSearch, sleepTime, tableSize, snapTime;<br /> 		<br />         nInsert = Integer.parseInt(args[0]);<br /> 		<br />         nDelete = Integer.parseInt(args[1]);<br /> 		<br />         nSelect = Integer.parseInt(args[2]);<br /> 		<br />         nSearch = Integer.parseInt(args[3]);<br /> 		<br />         sleepTime = Integer.parseInt(args[4]);<br /> 		<br />         tableSize = Integer.parseInt(args[5]);<br /> 		<br />         snapTime = Integer.parseInt(args[6]);<br /> 		<br />         final PhoneBookStress stress = new PhoneBookStress(<br />                 new SimpleSpace4J("PhoneBook"), nInsert, nDelete, nSelect,<br />                 nSearch, sleepTime, tableSize, snapTime);<br /> 		<br />         stress.started = System.currentTimeMillis();<br />         <br />         Runtime.getRuntime().addShutdownHook(new Thread() {<br /> <br />             @Override<br />             public void run() {<br />             	<br />             	long totalInserted = stress.totalInserted;<br />             	long totalDeleted = stress.totalDeleted;<br />             	long totalSelected = stress.totalSelected;<br />             	long totalSearched = stress.totalSearched;<br />             	long snapshotsTaken = stress.snapshotsTaken;<br />             	long now = System.currentTimeMillis();<br />             	<br />             	stress.running = false;<br />             	<br />             	stress.interruptAll();<br />             	<br />             	try { Thread.sleep(1500); } catch(Exception e) { }<br />             	<br />             	System.out.println("\n\n========== Results:");<br />             	System.out.println("Inserted = " + totalInserted);<br />             	System.out.println("Deleted  = " + totalDeleted);<br />             	System.out.println("Selected = " + totalSelected);<br />             	System.out.println("Searched = " + totalSearched);<br />             	System.out.println("Snashopts= " + snapshotsTaken);<br />             	System.out.println("Time: " + (now - stress.started) + " ms");<br />             	<br />             }<br />         });<br />         <br />         stress.start();<br />     }<br /> 	<br /> }<br /> <br /> [/code]<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://s4j.mentaframework.org/posts/preList/3/3.page</guid>
				<link>http://s4j.mentaframework.org/posts/preList/3/3.page</link>
				<pubDate><![CDATA[Fri, 5 Sep 2008 14:44:15]]> GMT</pubDate>
				<author><![CDATA[ saoj]]></author>
			</item>
	</channel>
</rss>