I generated two matrices of1000 x1000:
First Matrix:O and#.
Second Matrix:O andB.
Using the following code, the first matrix took 8.52 seconds to complete:
Random r = new Random();for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (r.nextInt(4) == 0) { System.out.print("O"); } else { System.out.print("#"); } } System.out.println(""); }With this code, the second matrix took 259.152 seconds to complete:
Random r = new Random();for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (r.nextInt(4) == 0) { System.out.print("O"); } else { System.out.print("B"); // only line changed } } System.out.println("");}What is the reason behind the dramatically different run times?
As suggested in the comments, printing onlySystem.out.print("#"); takes7.8871 seconds, whereasSystem.out.print("B"); givesstill printing....
As others pointed out that it works for them normally, I triedIdeone.com for instance, and both pieces of code execute at the same speed.
Test Conditions:
- I ran this test fromNetbeans 7.2, with the output into its console
- I used
System.nanoTime()for measurements
- 67Try changing rand.nextInt(4) == 0 to i < 250 to eliminate the effect of the random generator. You might run out of entropy that slows down the random generationfejese– fejese2014-02-21 23:49:43 +00:00CommentedFeb 21, 2014 at 23:49
- 3Both seem to run for same amount of time on my machine, ~4 seconds.Sotirios Delimanolis– Sotirios Delimanolis2014-02-21 23:51:36 +00:00CommentedFeb 21, 2014 at 23:51
- 173if you are suggesting that printing B takes more time than printing #....why dont you try to print all B & all # rather than relying on random variable rKakarot– Kakarot2014-02-21 23:52:49 +00:00CommentedFeb 21, 2014 at 23:52
- 22Based on the accepted answer, you apparently didn't try running it with output redirected to a file or /dev/null.Barmar– Barmar2014-02-23 03:21:10 +00:00CommentedFeb 23, 2014 at 3:21
- 29@fejese, Random() is not a cryptographical rng and so doesn't use up the entropy pool.Divide– Divide2014-02-25 11:44:46 +00:00CommentedFeb 25, 2014 at 11:44
3 Answers3
Pure speculation is that you're using a terminal that attempts to doword-wrapping rather than character-wrapping, and treatsB as a word character but# as a non-word character. So when it reaches the end of a line and searches for a place to break the line, it sees a# almost immediately and happily breaks there; whereas with theB, it has to keep searching for longer, and may have more text to wrap (which may be expensive on some terminals, e.g., outputting backspaces, then outputting spaces to overwrite the letters being wrapped).
But that's pure speculation.
7 Comments
System.out.println doesn't do wordwrapping; the thing it was outputting to was doing word-wrapping (and blocking, soSystem.out.println had to wait).I performed tests on Eclipse vs Netbeans 8.0.2, both with Java version 1.8;I usedSystem.nanoTime() for measurements.
Eclipse:
I got thesame time on both cases - around1.564 seconds.
Netbeans:
- Using "#":1.536 seconds
- Using "B":44.164 seconds
So, it looks like Netbeans has a bad performance on print to console.
After more research, I realized that the problem isline-wrapping of the max buffer of Netbeans (it's not restricted toSystem.out.println command), demonstrated by this code:
for (int i = 0; i < 1000; i++) { long t1 = System.nanoTime(); System.out.print("BBB......BBB"); // <- contains 1000 "B"s long t2 = System.nanoTime(); System.out.println(t2 - t1); System.out.println(""); }The time results are less than 1 millisecond every iteration exceptevery fifth iteration, when the time result is around 225 milliseconds. Something like (in nanoseconds):
BBB...31744BBB...31744BBB...31744BBB...31744BBB...226365807BBB...31744BBB...31744BBB...31744BBB...31744BBB...226365807...And so on.
Summary:
- Eclipse works perfectly with "B"
- Netbeans has a line-wrapping problem that can be solved (because the problem does not occur in eclipse)(without adding space after B ("B ")).
3 Comments
Yes, the culprit is definitely word-wrapping. When I tested your two programs, NetBeans IDE 8.2 gave me the following result.
- First Matrix: O and # =6.03 seconds
- Second Matrix: O and B =50.97 seconds
Looking at your code closely: you have used a line break at the end of the first loop. But you didn't use any line breaks in the second loop. So you are going to print a word with 1000 characters in the second loop. That causes a word-wrapping problem. If we use a non-word character " " after B, it takes only5.35 seconds to compile the program. And If we use a line break in the second loop after passing 100 values or 50 values, it takes only8.56 seconds and7.05 seconds respectively.
Random r = new Random();for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (r.nextInt(4) == 0) { System.out.print("O"); } else { System.out.print("B"); } if (j % 100 == 0) { // Adding a line break in second loop System.out.println(); } } System.out.println(""); }Another advice is to change the settings of NetBeans IDE. First of all, go to NetBeansTools and clickOptions. After that, clickEditor and go to theFormatting tab. Then selectAnywhere inLine Wrap Option. It will take almost 6.24% less time to compile the program.
1 Comment
Explore related questions
See similar questions with these tags.



