Experiences In Java Performance Engineering
I have been spending copious amounts of time trying to speed up our Web server. The results have been heartening and the experience typical of performance engineering. It's one of the most amazing activities of software development. Incredibly frustrating when you cannot speed it up but an adrenaline-rush when it does and the first person I bother when it works is poor Rajiv.
I am trying to log the various performance enhancements - some are just tips and some are things I discovered or used. Some you know, perhaps, some you don't.
- Socket Writes : The lesser the better. Buffer your socket writes so you never inadvertently write multiple times to the socket. Copying to the buffer is much less expensive than a socket write especially for small data.
- Socket Reads : Similarly, read as much as you can from the socket in one shot. Smaller reads will result in lesser performance. These rules are true of File streams as well.
- Socket Connections : Again the lesser the better. Creating a connection is extremely expensive. You can do several ten times of requests/second more on a kept-alive connection than if you have to create connections.
- Socket properties : Setting socket properties is expensive. e.g. java.net.Socket.setSoTimeout. Avoid setting socket properties per request, see if you can change them to per connection? [multiple requests in a kept-alive connection]
- String Operations : If you are writing extremely performance sensitive code such as a highly benchmarked web server :-) then keep Strings to a minimum. I cannot stress this enough. If you have a large character stream that you need to tokenize, parse, etc, use references into character arrays to reduce String operations. Create a class that takes a pointer to this character array, its start and length and you can create lots of instances of this class to point to pieces of the character stream instead of String objects which make copies of the characters. String concatenations can be quite expensive too.
- Avoid data copies : This is obvious, isn't it? However, there are so many methods that try to be safe and make data copies it happens without even one knowing it. Examples of classes that do it are - String , ByteArrayOutputStream.toByteArray(). Don't get me wrong - there's nothing wrong with these classes, it's just that sometimes one doesn't realize that these methods are causing data copies which is affecting performance.
- Set instead of List : A common programming mistake is the wrong choice of data structure to do a contains() . List.contains() is an O(n) operation versus Set.contains() for HashSet has a best case behaviour of O(1). So, if order does not matter to you, use Set.
- Object Pooling : Some classes are expensive to create. eg. large arrays. Use pools of these objects so they can be reused, there by preventing GC lags for these, and primarily creation costs. Interestingly, PrintWriter, if pooled, shows considerable performance improvement. The creation of the object is expensive because of a call to get the line separator in its constructor.
- You can buffer at unexpected places. e.g. You may have a logger thread that asynchronously logs certain frequently running activities (e.g. access logs) and notifying the writing thread every time will be expensive. Might help considerably to collect a few and then notify the thread.
- Integer.toString() is much much faster than
integer + "". - try-finallies result in interesting performance degradation in Sun JVMs. Read about it here and Rajiv's excellent follow-up on it here.
- Lazy instantiation : Don't create something until you need it.
- The usual optimizations always apply - loop optimizations, moving loop-invariant code out of the loop, unused variables, repetitive processing, etc.
- Perceived performance : [I would love to collect my thoughts on that one sometime - we have had some very interesting experiences with perceived performance enhancements over the years ] The faster you respond so that the browser starts to refresh [if memory serves me right, a 50 milli- second response is perceived to be instantaneous by a human being] the more responsive the web-server looks although the total amount of time for the response might be the same as in the case if all data was returned in a single write.

107 comments:
First of, all suck-up aside, it shows that you work for pramati. Secondly, your simple advice on Set versus List is pure gold!
Regarding human perception... the human eye can do about 28 "frames per second", but you have no guarantee that they'll overlap with the refreshes of the CRT. 35-40 miliseconds should be more than enough.
Well, ordering (or lack thereof) isn't the sole reason to use Set instead of List. Recall that Set stipulates that no duplicates are allowed whereas List allows dupliates. You should ONLY use a Set where your data is, in fact, a Set and does not contain duplicates.
Doesn't the StringBuffer (starting with JDK1.2 or JDK1.3) use copy-on-write? So, given
String s1 = "This is a test";
String s2 = s1.substring(3,5);
s2 will share its character array with s1. In essense, the String object is already doing what you are recommending to implement with custom string reference objects.
Cool stuff Sachin!
StringBuffer's substring() method delegates to String(int,int,char[]) which does, as you say, just refer to the private char[] of the original String. (Incidentally, is this is a potential memory leak if you have long long-lived references to small substrings of large Strings?) I don't doubt Sachin, but I'm curious what causes the performance problems.
Hmm, i thought object creation wasn't that much of a problem with the new GC.
It is possible to write a server without any object creation, except for the objects Java creates for security checking. How? No matter what your server does, every request uses the same set of objects. Preallocate them, then reuse them. If there are some variations, preallocate the objects required for that too. If there are shared resources (files, db, other tiers) pool them. A server's tasks are very repetitive: there are never surprises, so you never need to use "new".
This a server - why do you need Strings? Strings are for humans. Pool char or byte arrays.
Are your arrays not exactly the right size? Doesn't matter: Pool big ones, and only use the number of bytes you need. Computers have lots of memory now days.
- rpcxdr@yahoo.com
Firstly, thanks to Dion for linking my article here. My primary intention was to chronicle my findings while involved in a performance tuning exercise. The effort was focused at brute throughput improvements and therefore involved more low-level tweaking. I would have put more effort into the article if I had known I was addressing an audience of this magnitude :-). So, being a victim of unexpected attention, I think it would be prudent to cover a couple of findings in more detail since quite a few people have mentioned them.
I would very strongly agree with people who have mentioned that 'clean' code is much better than 'clever' code. Some of the tunings are potential cases where encapsulation gets broken, code maintainability gets affected. Also, if performance is satisfactory, I would prefer not to go overboard tuning it. Sometimes though, when you are competing with other very similar [standard-based] products, you cannot explain to a potential customer that your code is slower than XYZ because our code is much 'cleaner'.
A lot of people have mentioned String.substring* making a reference to the original char array. Yes it does that, there are, however, some useful cases of using the character array and pointers to pieces of data inside it [lets call it a CharBuffer] without using String. Lets take the case of the Web Server again. HTTP request headers are read from the socket's input stream into a buffer. There is no way of creating a String from this buffer without a data copy. Subsequently there is no way to retrieve the character array back from String without a data copy.
There are cases where you need to convert the String to a char[] e.g. the request line needs to be written to access logs. CharBuffer saves data copies in these situations. Another situation arises because of the case insensitive nature of HTTP headers. It's cheaper to convert them to lower case or upper case in place and then process the request - again CharBuffer helps.
Object pooling does help considerably although it could again be considered as excessive optimization for most software. Although, GC performance has significantly improved version after version, if you really have long lasting allocations like buffers, pooling does help. PrintWriter, like I mentioned in the article, is a different case, where the cost of executing its constructor makes it a good choice for pooling.
* for business reasons, our code compiles with JDK 1.3 so I cannot make use of JDK 1.4 features. If some point is redundant as a result of newer classes in JDK 1.4 please bear with me :-)
Make me a happy person. change your blogger settings to automatically ping weblogs. Then I'll know when you've updated. I look forward to more posts.
Knock Knock.
Hi,
Some of these blogs are awesome, I have spent the whole day going from one to another collecting information if you are interested in index of ebook then you you can find out more about index of ebook
See you over there
Hi you have a great blog,
I am involved with software downloads and have new releases atsoftware downloads
see you soon
I have am interested in software downloads and have recently found in updated information about software downloads here.
keep the link going
One good resource for pos software and many more free software alternatives is Software4YourSuccess.com
Yes it is my site and I would love for you to drop by for a second. From there you will have free access to several of my products such as The Marketing Toolbar (which is goldmine of information on how to do things quickly and on the cheap, thus saving you time and money).
Also for webmasters I have created Webmaster Wizards, which will help you with almost every aspect of putting code on your site from things such as legal and privacy disclaimers to popunders. I have so much content and free software there I could fill up this whole blog, so check it out Thanks, Sincerely Rob Rudd
Generate massive Google AdSense income running your own Article Directory on the Internet. Check out this internet marketing tool.
Hi there.....
Visited your nice blog today. It is very Interesting......
I have a blog that focuses on MARKETING SOFTWARE.
Do you know what the hottest new blog software titles are? Vist my blog to find out!
I came across you blog and thought you may find this site usefull. It has gas saving tips and where to find cheap gas. travel austria
:)
Imagine the power of tens of thousands of other web sites being able to easily display your RSS feeds on their web sites for content. Click here: rss announcer.
Excellent internet marketing resource articlre.
Keep up the great internet marketing resource blog. I find it very informative. I check back soon
Thanks again for a great and informative internet marketing resource articlre.
I was reading your blog and thought i would mention this free blog hosting site.
Free blog hosting using wordpress. The top blogging tols online and many free templates to choose from. Free hosting. Get your free blog template blogger now!
GET FREE BLOG NOW
::FREE BLOGS AND FREE WORDPRESS BLOG HOSTING - CREATE UNLIMITED BLOGS NOW ALL FREE ::
Free adult blogging hosting speicalist
Love the blog fella.. Definately be giving you lot a bookmarking..
Just a quick note if anyones interested in blog and ping then this is the tool for you.. Down from $149 to the amazing price of $19.99. Pay via egold or paypal.. Get it while its at this low low price..
Inevitably this always catches up with you and usually at the worst possible time automatic . automatic
Nice blog.. Gotta get me one soon..
Ok if your interested in blog then this is the tool for you.. Down to $19.99. Pay via egold or paypal.. Get it while its at this low low price.. 2 days only..
Very cool blog you got! I just added you to my bookmarks!
I have a great article resource you might want to check out.
I like your blog a lot. Lots better than most I've seen! website design bathurst
Hi Iwas just blogsurfing and found your blog I think blogs are a great idea keep it up .. I also have started a blog and intend to make more .. I also have a website that sells very cheap software .. cheap academic software
I just started up so be my guest and take a look you may find something you need ..cheap academic software
Found yourr blog looking for ebooks
ebooks
Learn the secrets without paying for them
Free ebooks
**ebook**
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have found free ebooks site/blog. It pretty much covers free ebooks related stuff.
go and get your free ebooks :-)
Great blog! Lots of character.
I found a article directory site that is really good for article directory information.
Hope you like it.
Cool blog you have. I have a easy ways to make money related site. Check it out if you get a chance. The URL is easy ways to make money
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have a small business web hosting services site/blog. It pretty much covers small business web hosting services related stuff.
Come and check it out if you get time :-)
Hi there Blogger there I was browsing for information on compiler e book software and up popped your
Experiences In Java Performance Engineering not a perfect match for the compiler e book software I was searching for but I sure enjoyed
my visit.
Stop by my site if you get time I am sure you will find it of interest, and grab some free software
for making the effort
Thanks again
Joe
Good Blog
Please visit
Advanced Business Marketing
and leave a comment.
I enjoyed reading your blog. There is a lot of useful information about personal web hosting services in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about personal web hosting services.
Thank you
TWP Admin
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have a php web hosting site/blog. It pretty much covers php web hosting related stuff.
Come and check it out if you get time :-)
I just came across your blog about managed forex and wanted to drop you a
note telling you how impressed I was with the information you have posted here.
I have a managed forex site. It pretty much covers managed forex related stuff.
so I know what I'm talking about when I say your site is top-notch! Keep up the great work, you are providing a great resource
on the Internet here!
Thanks,
Phill
hello, your blog is interesting to read, I have a website about internet marketing, it should be helpful to you in making more web money. This is a global trend that more and more people can make a living online, so make sure you visit it.
cheap internet hosting Web Hosting Ecommerce Your source for the latest in the cheap internet hosting industry, News, links and latest cheap internet hosting developments.
I like to gamble. I like to gamble a lot. I've also made quite a comfortable living in the casinos.
online betting sports gambling has been a casino online where I have been a consistent winner. online betting sports gambling is an Egold casino with instant payouts.
They run a fair shop and aren't out to cheat anyone.
As a professional gambler, I highly recomend them for online gambling.
By the way, I like your blog quite a bit.
Thanks,
Have a great day.
Market oi millions with blogblastersports marketingsports marketing
Please go to http://ww.blog-masters.net
Want more clicks to your Adsense Ads on your Blog?
Then you have to check out my blog. I have found a FREE and Legitimate way that will increase your earnings.
Come Check us out. How to Boost Your AdSense Revenue
Hello, just visited your blog, it's informative. I also have a website related togoogle adsense software. So make sure you visit and hope it's useful.
It must have taken you hours to get your blog to this standard.
I have a directory ebook site/blog. It pretty much covers directory ebook related stuff.
Regards,
Mark
Hi: Just came across your blog. Interesting post and good looking site.
We recently set up a website offering totally free blog and website awards for sites with legal & legal related exceptional content.
No, we are NOT directly selling anything. If you would like to enhance your blog/web site, visit our web site award program web site. blog/website with one of our classy website award graphics! If you are interested, here is the link: http://www.web-site-award-winning.com
**web site award program**
Hi,
I just across sites and found that your Blogs are amazing.
Do you know, your blog can generate extra income by posting Google Adsense? If you ever know about Adsense, you understand to get hundreds of dollar per month is not an easy way. One of the most important is to generate massive traffic.
Few days ago, I found a very useful software that will generate hundreds of back links to our website. Do you know why back links is so important to generate traffic?
Yes, you are right! back links will jump up your position in search engine! If your position gets higher from day to day, you'll find your traffic increase significantly as well.
That software is Blog Link Generator!
This software so powerful. You even do not need to create links directory in your site. Is that sound good? You put your link in other's website, but you never put a link back to their site?
Visit www.LinkInBlog.com now and I so confident you'll never sorry.
I enjoyed reading your blog. There is a lot of useful information about canadian web hosting in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about canadian web hosting.
Thank you
TWP Admin
Find great deals on eBay with the misspelledauctions.com search engine
Misspelledauctions.com
Awesome
I am about to show you a way that you can generate thousands of keyword targeted links back to your web site starting today!
Find great deals on eBay with the misspelledauctions.com search engine
Misspelledauctions.com
Awesome
I enjoyed reading your blog. There is a lot of useful information about turnkey web site design in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about turnkey web site design.
Thank you
TWP Admin
business software allianceBuild Your Profit Making Customer List Automaticallybusiness software alliance
Hi, great blog! Let's talk Marketing and PR. Please feel free to visit my blog too at
, RushPRnews Daily Gazette, Open-Call for Writers.
My website is** RushPRnews press release services, distribution and free web posting** . Cordially, Anne Laszlo-Howard
I enjoyed reading your blog. There is a lot of useful information about free name free web hosting in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about free name free web hosting.
Thank you
TWP Admin
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have a email india marketing site/blog. It pretty much covers email india marketing related stuff.
Come and check it out if you get time :-)
Blogger -- Your " Experiences In Java Performance Engineering " post is .... shall we say, Unique? I was out looking for details on Mass Submitter when I found your page, and became interested as I read your posts.
What If This Could All Happen Automatically,
with a simple push of a button.....
Great Blog! Ilike it.I have Site where you can Find sex partnerTake a look if you have a minute. Thanks and have a good one!
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have a internet marketing tool site/blog. It pretty much covers internet marketing tool related stuff.
Come and check it out if you get time :-)
I enjoyed reading your blog. There is a lot of useful information about instant site turnkey web in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about instant site turnkey web.
Thank you
TWP Admin
I just came across your blog about search engine and wanted to drop you a note telling you how impressed I was with the information you have posted here. I also have a web site about search engine so I know I'm talking about when I say your site is top-notch! Keep up the great work, you are providing a great resource on the Internet here!
Cool blog about home based business. I'm
new to this whole blog thing but I have a
website basically about home based business also.
Check it out sometime...
nice blog enjoyed it :)
Keep up the excellent work! and i bookmarked u!
!
Hello everyone! ... sorry I'm a newbie, how does this blog thing work? I bought some products from this store: www.eBookLovers.com but too dumb to figure out. Any help would be greatly appreciated!
I enjoyed you blog about antiaging bath vitamin. I also have a site about antiaging bath vitamin which makes me appreciate this one even more! Keep up the good work!
putting to waste some good money that could have been used in other areas of development for the business involved.
I enjoyed reading your blog very much. Thanks.
Wow, I really like this one. I have a website that talks mostly about home homework make money u14a50 unitedpartnerprogram.com work You should check it out sometime.
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have a business cash safelist wealth site/blog. It pretty much covers business cash safelist wealth related stuff.
Come and check it out if you get time :-)
Interesting blog. Have you visited blog ping xmlrpc
##Deadeasy##
Yo, you have a Terrific blog here! Lots of content means more readers, more readers means more Sales!
I'm definitely going to bookmark you!
I have a make computer faster free and downloadmake computer faster free and download site/blog. It pretty much covers make computer faster free and download Problems with your Windows Xp Computing !
Come and check it out if you get time We are just a Click Away ! :-)
Hi Blogger. So many sites I visited today, while looking for forex ebooks pages to post to my blog, were full of garbage. It was nice to find something real at your site. Well, I better go look for some more forex ebooks pages for my own readers. Thanks.
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have a **ebooks** site/blog. It pretty much covers ebook/info/money making related stuff.
Come and check it out if you get time :-)
I really like your blog. Did you know that you can find all kinds of Ways To Make Money
online. It's the best place for finding Ways To Make Money
so tell everyone.
Hi, here is the greatest business distance long opportunity voip of the 21st century. Come and check the videos about business distance long opportunity voip and see why it is possible to make $4,000 a week ! Dave
I enjoyed reading your blog. There is a lot of useful information about cheap web hosting in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about cheap web hosting.
Thank you
TWP Admin
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have a engine ffa free generation lead lead links ranking search system site/blog. It pretty much covers engine ffa free generation lead lead links ranking search system related stuff. Plus you can advertise to billions using our engine ffa free generation lead lead links ranking search system tools.
Come and check it out if you get time :-)
Are you a gambling lover? Do you like to spend your vacations at Atlantic City or even Las Vegas? What is your favorite casino game? Blackjack? Poker? Craps? Or maybe it’s Baccarat? Whatever it is you can play it from home as well! Want to know more about bad greedy online gambling casino
Hello there, I was recently doing a search through blogs for the phrase business christian home. I happened to come across yours even though it wasn't particularly related to what I searched for. I still decided to read your blog a bit, and I just wanted to say that you have a good thing going here. Anyway, I've only just recently started a business christian home website, and I'm searching blogs trying to find ideas. Feel free to visit the site when you get a chance if you wish. Much success, Eric.
Help me Dude, I think I'm lost..... I was searching for Elvis and somehow ended up in your blog, but you know I'm sure I saw him in a car lot yesterday, which is really strange because the last time I saw him was in the supermarket. No honest really, he was right there in front of me, next to the steaks singing "Love me Tender". He said to me (his lip was only slightly curled) "Boy, you need to get yourself a San Diego cosmetic surgery doctor ,to fit into those blue suede shoes of yours. But Elvis said in the Ghetto nobody can afford a San Diego plastic surgery doctor. Dude I'm All Shook Up said Elvis. I think I'll have me another cheeseburger. Then I'm gonna go round and see Michael Jackson and we're gonna watch a waaaay cool make-over show featuring some Tijuana dentists on the TV in the back of my Hummer. And then he just walked out of the supermarket singing. . . "You give me love and consolation,
You give me strength to carry on " Strange day or what? :-)
Hi, here is the greatest business distance long opportunity voip of the 21st century. Come and check the videos about business distance long opportunity voip and see why it is possible to make $4,000 a week ! Dave
Use our affordable directory ecommerce host web to get your web hosting site seen. Increase your chances of getting quality traffic and increase your revenue through or straight forward affordable directory ecommerce host web
Get your site heard in our google directory
Make us your homepage and read the daily updated articles.
What a blog! Hi... this is important, I wouldn't post this message if it's not urgent, but this deal is almost over! You'd better check it out or you'll regret it forever: Tons of brandnew information products with master resell rights! Miss it and you'll hate yourself forever!!!
I enjoyed reading your blog. There is a lot of useful information about business web hosting in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about business web hosting.
Thank you
TWP Admin
I just came across your blog about E-mail Marketing eBook and wanted to drop you a note telling you how impressed I was with the information you have posted here. I also have a web site & blog about E-mail Marketing eBook so I know I'm talking about when I say your site is top-notch! Keep up the great work, you are providing a great resource on the Internet here!
Hey, you have a great blog here! I'm definitely going to bookmark you!
I have a anti anxiety drug site/blog. It pretty much covers ##KEYWORD## related stuff.
Come and check it out if you get time :-)
I enjoyed reading your blog. There is a lot of useful information about business web hosting in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about business web hosting.
Thank you
TWP Admin
Just A Quick Hello From VooDoo Blogger :-)
Just A Quick Hello From VooDoo Blogger :-)
Hey, you have a great blog here! I'm definitely going to bookmark you! Get free
Traffic to your site/blog. It will Improve your page rank and it's free.
Go and check it out if you get time :-)
I enjoyed reading your blog. There is a lot of useful information about free web hosting in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about free web hosting.
Thank you
TWP Admin
Hey, If you are looking for a fantastic feel good vitamin watervitaminvitamin water then you have to check this out.
I have a pretty cool site about Check out twinks for cash
I enjoyed reading your blog. There is a lot of useful information about blogging service in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about blogging service.
Thank you
TWP Admin
I enjoyed reading your blog. There is a lot of useful information about blog service in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about blog service.
Thank you
TWP Admin
Hey, you have a great blog here! I'm definitely going to bookmark you! Get free
Traffic to your site/blog. It will Improve your page rank and it's free.
Go and check it out if you get time :-)
Hey, you have a great blog here! I'm definitely going to bookmark you! Get free
Traffic to your site/blog. It will Improve your page rank and it's free.
Go and check it out if you get time :-)
I enjoyed reading your blog. There is a lot of useful information about affordable web hosting plan in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about affordable web hosting plan.
Thank you
TWP Admin
Hello, just visited your blog, it's informative. I also have a website related togoogle adsense software. So make sure you visit and hope it's useful.
Hello, your blog is inmformative, I just found a brand new forex trading system using both Mathematical and psychlogical approch, hope you can visit and it will be useful to your trading life.
I enjoyed reading your blog. There is a lot of useful information about free turnkey web site in it. We offer Turnkey Websites and Reliable Hosting. We also provide a blogging service that will help your site get indexed fast and keep the search engines visiting your site. Click here for more information about free turnkey web site.
Thank you
TWP Admin
I discuss this topic daily myself. I also have a website that talks about canadian online survey related things. Go check it out if you get a chance.
Congratulations on your nice site. I have a web site traffic statisticssite. It covers web site traffic statistics related things.
I believe construction of such projects requires knowledge of engineering and management principles and business procedures, economics, and human behavior.
Post a Comment