LINQ and loops

by Matt 28. April 2010 09:52

Well, gosh. What a busy few months. What started as a bit of spit and polish to a website has turned into a huge rewrite and a great opportunity to learn and play with MVC(2), the Spark view engine, Lucene.net and NHibernate. But more on those some other time. Today, I’m interested in a performance problem that wasn’t what I was expecting it to be.

One core scenario of this website is that users can watch video files. We don’t want to allow them to view just anything, so we grant them access to a subset of the videos. Which means we have the following requirement: what programmes does the user have access to watch?

This is calculated like so: get the video access tokens for the user. Map each token to an episode. Strip out episodes which don’t have videos available. Retrieve the programmes for all viewable episodes.

For better or worse, this touches 5 tables across 3 separate databases.

We wrote a cache.

And you know what? It works great. The site is fast, the data is readily available, everybody is happy.

Except for one user.

We have a demo user that is granted access to a large number of episodes in a large number of programmes, ready to be used at conferences and other events.

This user killed the site.

Once the data was in the cache, everything was great. But it took 5 minutes to get into the cache. And killed the site while it was doing so.

I was expecting some trouble with this user – they didn’t work well on the existing site, and it’s obvious that we’re doing too much database activity. So I fired up the wonderful NHProf to see exactly what was going wrong and immediately proved myself wrong. All the data was being retrieved with a minimum amount of fuss and sql statements and round trips to the database. It took 5 seconds.

Now, we are definitely doing too much with the database here. We really could do with denormalising some of the data, using less databases and pulling back ids instead of unused entities. But it still only took 5 seconds. As an edge case populating a cache for a user only used by staff at conferences, 5 seconds is pretty much ok.

So what was happening for the remaining 4 minutes and 55 seconds?

The title of the post might help. The heart of this little process was a LINQ to objects query that joined up the lists from the various databases to create the final list of programmes, episodes and tokens that we could cache and present to the user. It went something like this:

var tokens = GetTokens();
var episodes = GetEpisodes(tokens);
var availableEpisodes = GetAvailableEpisodes(episodes);
from p in GetProgrammes(availableEpisodes)
select new ProgrammesWithTokens(p.Id, p.Title, GetTokensForProgramme(p, episodes, tokens))

where GetTokensForProgramme was defined like:

from t in tokens.OrderByDescending(x => x.GrantedDate)
from e in episodes
where e.OpaqueStringId == t.OpaqueStringId 
   && e.EpisodeNumber == t.EpisodeNumber 
   && p.Episodes.Contains(e)
select t

Now, there are two glaring issues going on here: We’re always ordering the tokens list – we could do that once before anything else. Similarly, we could do something about the p.Episodes.Contains(e) which isn’t going to be very quick.

But that’s small fry. Where’s the real problem?

It took me a little while to realise that what looks deceptively like nice, declarative, friendly LINQ, is in fact (of course) nested loops. Three deep. This simple bit of data collation is O(n * m * p).

I didn’t mention data size before. Turns out it’s not really that large. The demo user has about 1600 tokens, for 1500 available episodes for about 300 programmes.

Not much, actually.

But when you count the looping, this gives us 300 * 1600 * 1500 = 720,000,000 iterations.

Seven hundred and twenty MILLION iterations. That’s 720 MILLION string comparisons, and 720 MILLION list traversals for the Contains calls. It’s also 299 unnecessary ordering of the tokens list.

That’s where my 5 minutes was going.

Rewriting this as a bunch of lookups has reduced this bottleneck to essentially the time it takes to read from the database – about 5 seconds.

So the moral of the story is simple. LINQ is nice. It’s lovely. But when you’re doing multiple from statements, don’t forget it’s now doing nested loops.

That can really hurt.

Tags:

Comments (129) -

cyclerack
cyclerack
3/4/2011 9:15:25 AM #

Fair-and-square point you produce in sticklebackplastic com . Interesting to study the post and supplemental thoughts verbalised by writers on this and different websites. A post a day keeps the remarks arriving.

Reply

LAURENCE  Debora
LAURENCE Debora
5/22/2011 4:56:18 AM #

Recherche thématique sur plusieurs thèmes, c'est sukoga.com, moteur.

Reply

LAURENCE  Debora
LAURENCE Debora
5/27/2011 8:32:06 AM #

Liste d'annuaires détaillées pour faciliter le référencement, Créez votre propre article.

Reply

New york yankees Baseball cap
New york yankees Baseball cap
6/19/2011 3:06:14 PM #


I've learned a lot from your blog here,Keep on going,I will keep an eye on it,One more thing

Reply

best suv 2010
best suv 2010
7/20/2011 10:25:08 PM #

Is it ok if I quote your article in my monthly newsletter? I would think this article suits my topic perfectly. Well ya, thanks for posting this article.

Reply

free i pad
free i pad
7/23/2011 1:16:13 PM #

I wonder if he cheated on her? I remember he cheated on his previous wife with JLO so it wouldn’t be surprising.

Reply

LAURENCE  Debora
LAURENCE Debora
7/27/2011 10:47:56 AM #

Bienvenue sur annuaires-gratuit.com.Des fonctionnalités inédites, nombreuses annuaires.

Reply

DEBORA Laurence
DEBORA Laurence
8/1/2011 8:34:55 AM #

Il ne vous reste plus qu' à créer votre propre annuaire, l'inscription est  gratuite .

Reply

garage automation
garage automation
8/5/2011 9:26:47 AM #

Very Interesting. Is there any more information on the topic?

Reply

DEBORA Laurence
DEBORA Laurence
8/8/2011 10:05:33 AM #

Vous pouvez configuré vos systèmes de paiement allopas sur annuaires-gratuit.com

Reply

DEBORA Laurence
DEBORA Laurence
8/9/2011 9:22:51 AM #

Remplissez les informations ci-dessous pour créer votre annuaire, annuaires-gratuit.com

Reply

DEBORA Laurence
DEBORA Laurence
8/9/2011 11:23:44 AM #

Remplissez les informations ci-dessous pour créer votre annuaire, annuaires-gratuit.com

Reply

DEBORA Laurence
DEBORA Laurence
8/9/2011 6:40:46 PM #

Recevoir la newsletter et les informations des partenaires de annuaires-gratuit.com

Reply

DEBORA Laurence
DEBORA Laurence
8/9/2011 7:46:01 PM #

Recevoir la newsletter et les informations des partenaires de annuaires-gratuit.com

Reply

DEBORA Laurence
DEBORA Laurence
8/9/2011 9:18:03 PM #

Recevoir la newsletter et les informations des partenaires de annuaires-gratuit.com

Reply

DEBORA Laurence
DEBORA Laurence
8/13/2011 4:20:03 AM #

Vendez aux enchères vos objets neuf.Vendre et acheter aux enchères sur sibeys.com,

Reply

DEBORA Laurence
DEBORA Laurence
8/13/2011 6:58:41 AM #

Vendez aux enchères vos objets neuf.Vendre et acheter aux enchères sur sibeys.com,

Reply

DEBORA Laurence
DEBORA Laurence
8/13/2011 10:59:20 AM #

Le système d'Enchère automatique sibeys.com, vendez aux enchères vos objets neuf.

Reply

Erought
Erought
8/29/2011 6:57:34 PM #

W. 442. An action <a href="http://www.drdreheadphones-sale.com/">dre headphones</a>had there been brought against the defendant on a covenant, <a href="http://www.drdreheadphones-sale.com/">dr dre headphones</a>that he would appear at any insurance office which the plaintiff might designate, <a href="http://www.topsunglassmall.com/">cheap oakleys</a>and answer all such questions as should be put to him with<a href="http://www.topsunglassmall.com/">ray ban sunglasses</a>regard to his health, in order that an insurance might be effected <a href="www.beatsbydrdre-headphones.com/">beats by dre</a>on his life, and would not afterwards do any act by which such insurance <a href="www.beatsbydrdre-headphones.com/">dr dre</a>should be vitiated. The declaration further averred, that the defendant <a href="www.beatsbydrdre-headphones.com/">beats by dr dre</a>had appeared and answered certain questions so put to him at the Rock <a href="http://www.ray-banlunette.com/">lunette ray ban</a>Life Insurance Company, and that the plaintiff had thereupon effected<a href="http://www.ray-banlunette.com/">ray ban aviator</a>an insurance with that Company, conditioned to be void in case the <a href="http://www.ray-banlunette.com/">ray ban wayfarer</a>defendant went beyond the limits of Europe, and then assigned as a <a href="http://www.canada-goosejakke.com/">canada goose</a>breach, that the defendant did go beyond the limits of Europe, but without any <a href="http://www.canada-goosejakke.com/">canada goose jakke</a>allegation of notice to him, either of the time and place of insurance, or of the condition <a href="http://www.canada-goosejakke.com/">canada goose jakker</a>which had thus been violated.

Reply

Wordfeud fusk och wordfeud hj&#228;lp
Wordfeud fusk och wordfeud hjälp
9/2/2011 9:02:47 AM #

Very Interesting. Is there any more information on the topic?

Reply

Andrew Cole
Andrew Cole United States
9/14/2011 3:32:13 AM #

Exceedingly educational many thanks, It looks like your subscribers would possibly want far more content similar to this continue the excellent effort.

Reply

cheat point blank
cheat point blank
10/7/2011 10:06:07 PM #

nice blog, I'll come back later, a useful post for me

Reply

Stephen
Stephen
10/17/2011 3:55:31 PM #

Thanks  for this super site.  Seems like there\\\'s always something new I learn even after being in the field for 10 years.

Reply

how to get rid of a cold sore
how to get rid of a cold sore
11/7/2011 3:04:57 PM #

Even though if McCain won, I wouldn’t really care because he’s also a pretty good president too. Anyways, GO OBAMA!!!

Reply

Gabriel Jefferson
Gabriel Jefferson United States
11/8/2011 10:25:40 PM #

Truly enlightening thanks, I reckon your trusty readers could very well want even more articles along these lines maintain the great content.

Reply

ixchel price
ixchel price
11/17/2011 10:07:23 PM #

You must take life the way it comes at you and make the best of it.-Yann Martel

Reply

Sport guy
Sport guy
11/22/2011 9:44:53 AM #

Thanks for info. Is there more info on this subject elsewhere?

Reply

Philix
Philix United States
11/22/2015 9:56:02 PM #

Great Website

Reply

Lashawn Ulwelling
Lashawn Ulwelling United States
1/15/2016 3:43:55 AM #

The dolphin saving you one is the best one!

Reply

Wilton Megeath
Wilton Megeath United States
1/15/2016 3:48:01 AM #

Let me be the first to say: Congrats, Neil! I've been following this site from day one, and have loved every single day of awesomeness that it has delivered. You deserve all the success coming your way. Keep it up!AWESOME!

Reply

Gia Agramonte
Gia Agramonte United States
1/15/2016 4:51:28 AM #

Congrats! This is such a great website, I know it will translate well into book form. Which is AWESOME!

Reply

Modesto Ziems
Modesto Ziems United States
1/15/2016 5:44:17 AM #

Congratulations, Neil! I love this site and I know I'll love the book. Christmas, birthdays, Father's Day 2010  check!

Reply

Wai Freifeld
Wai Freifeld United States
1/15/2016 7:06:43 AM #

AWESOME!Can't wait for that, will be something to want to accomplish day by day, to do something AWESOME!

Reply

Herbert Britson
Herbert Britson United States
1/15/2016 7:14:28 AM #

yeah, except the "dolphin saving you" one

Reply

Wilton Megeath
Wilton Megeath United States
1/15/2016 7:44:49 AM #

Congrats! This is such a great website, I know it will translate well into book form. Which is AWESOME!

Reply

Palmer Rinck
Palmer Rinck United States
1/15/2016 7:49:03 AM #

AWESOME!Can't wait for that, will be something to want to accomplish day by day, to do something AWESOME!

Reply

Kylee Marett
Kylee Marett United States
1/15/2016 8:32:34 AM #

the style of keeping you connected with so many things of different types is awesome and you find it interesting everytime.

Reply

Meggan Monas
Meggan Monas United States
1/15/2016 8:55:45 AM #

Thaaaat IS awesome! lol hehe

Reply

Herbert Palmerin
Herbert Palmerin United States
3/27/2016 5:56:00 AM #

I used to be very pleased to find this net-site.I wished to thanks to your time for this excellent learn!! I undoubtedly enjoying every little little bit of it and I've you bookmarked to take a look at new stuff you weblog post.

Reply

Clara Mccubbin
Clara Mccubbin United States
7/16/2016 1:08:02 PM #

an investment. Although you may have to pay for SEO services for a while, you can make all of that money back and then some once you start seeing a rise in traffic. You will need traffic to do your brick-and-mortar business, whether youÕre looking to promote it, sell things online or only make money off of advertisements.Luckily, great SEO services can provide you with additional traffic than it is possible to probably even imagine.

Reply

Anna Farris
Anna Farris United States
7/20/2016 7:43:30 AM #

Wow very thorough article. Thanks

Reply

buy trumpcoin
buy trumpcoin United States
7/20/2016 6:40:37 PM #

I really like your site design, where did you obtain it from? eitherway have  your blog readers heard about this crazy tech like bitcoin? I searched for TrumpCoin and this url came up TrumCoin.infoI think it would be a great point of discussion for your readersthanks from England! Here's a few great resources <a href="htttp://www.trumpcoin.info">trumpcoin</a>; & <a href="htttp://www.trumpcoin.com">trumpcoin llc</a>

Reply

Kathlene Fahrendorff
Kathlene Fahrendorff United States
7/20/2016 6:59:32 PM #

Thanks for the auspicious writeup. It if truth be told used to be a enjoyment account it. Look complicated to more added agreeable from you!

Reply

buy trumpcoin
buy trumpcoin United States
7/21/2016 2:41:03 PM #

I adore your blog design, wherever did you get a hold of it through? anyways have your readers heard about this weird thing similar bitcoin? I googled TrumpCoin and this site came up TrumCoin.infoI think it would be a great point of discussion for your readersCheers from England! Here's a few great resources <a href="htttp://www.trumpcoin.info">trumpcoin</a>; & <a href="htttp://www.trumpcoin.com">trumpcoin llc</a>

Reply

trumpcoin
trumpcoin United States
7/21/2016 2:44:08 PM #

I adore your blogging design, wherever did you get a hold of it from? back on track have you heard about this interesting coin similar bitcoin? I googled TrumpCoin and this site came up TrumCoin.infoI believe it would be a great point of discussion for your readersCheers from England! Here's a few great resources <a href="htttp://www.trumpcoin.info">trumpcoin</a>; & <a href="htttp://www.trumpcoin.com">trumpcoin llc</a>

Reply

Marita Canas
Marita Canas United States
7/24/2016 2:56:42 PM #

Unbelievable write-up, cheers, I will subscribe in direction of yourself RSS at the moment.

Reply

Pierre Jungen
Pierre Jungen United States
8/25/2016 4:10:24 AM #

Nice informative post. Hopefully you can also discuss some green home designs with nice architectural layouts

Reply

Domenic Zurita
Domenic Zurita United States
7/23/2018 6:46:57 AM #

Hello. impressive job. I did not anticipate this.

Reply

Damien Schettler
Damien Schettler United States
8/1/2018 7:35:05 AM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Ciera Navo
Ciera Navo United States
8/1/2018 7:35:07 AM #

With thanks! Valuable information!

Reply

Rolanda Ekstrum
Rolanda Ekstrum United States
8/1/2018 7:54:04 AM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Tia Radcliff
Tia Radcliff United States
8/1/2018 8:28:57 AM #

Don’t wear seat belts lest you drown in your own urine?

Reply

Carter Kirscht
Carter Kirscht United States
8/1/2018 8:46:45 AM #

With thanks! Valuable information!

Reply

Mildred Stroik
Mildred Stroik United States
8/1/2018 9:29:34 AM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Basil Falgout
Basil Falgout United States
8/1/2018 11:17:48 AM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Malcom Huling
Malcom Huling United States
8/1/2018 11:58:59 AM #

Don’t wear seat belts lest you drown in your own urine?

Reply

Randell Bugett
Randell Bugett United States
8/1/2018 12:02:17 PM #

With thanks! Valuable information!

Reply

Bethann Baseler
Bethann Baseler United States
8/1/2018 12:27:47 PM #

Black on black in the Charger I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Linnie Julen
Linnie Julen United States
8/1/2018 1:12:27 PM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Joey Morman
Joey Morman United States
8/1/2018 3:02:17 PM #

With thanks! Valuable information!

Reply

Sunshine Hiller
Sunshine Hiller United States
8/1/2018 3:02:18 PM #

Black on black in the Charg I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Jessie Burczyk
Jessie Burczyk United States
8/1/2018 3:08:07 PM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Lucretia Colby
Lucretia Colby United States
8/1/2018 3:18:14 PM #

Black on black in the Charg I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Arlyne Bladt
Arlyne Bladt United States
8/1/2018 3:34:23 PM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Jeffry Mccrimmon
Jeffry Mccrimmon United States
8/1/2018 3:45:54 PM #

With thanks! Valuable information!

Reply

Woodrow Tillett
Woodrow Tillett United States
8/1/2018 3:45:55 PM #

Black on black in the Charg I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Guadalupe Kanney
Guadalupe Kanney United States
8/1/2018 4:01:09 PM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Lesley Dimauro
Lesley Dimauro United States
8/1/2018 4:10:58 PM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Myles Burney
Myles Burney United States
8/1/2018 4:15:54 PM #

Don’t wear seat belts lest you drown in your own urine?

Reply

Theodore Baruch
Theodore Baruch United States
8/1/2018 5:36:43 PM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Siu Norskog
Siu Norskog United States
8/1/2018 5:54:19 PM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Myrtle Cella
Myrtle Cella United States
8/1/2018 6:22:26 PM #

With thanks! Valuable information!

Reply

Rodrigo Ringlein
Rodrigo Ringlein United States
8/1/2018 7:04:38 PM #

Don’t wear seat belts lest you drown in you own urine?

Reply

Phil Haskew
Phil Haskew United States
8/1/2018 7:11:39 PM #

With thanks! Valuable information!

Reply

Yvonne Urness
Yvonne Urness United States
8/1/2018 7:11:42 PM #

Black on black in the Charger I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Leeanna Sprafka
Leeanna Sprafka United States
8/1/2018 8:42:42 PM #

Black on black in the Charger I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Max Lievens
Max Lievens United States
8/1/2018 9:05:35 PM #

Black on black in the Charg I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Cleo Almasi
Cleo Almasi United States
8/1/2018 9:32:55 PM #

Black on black in the Charg I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Lanny Myerscough
Lanny Myerscough United States
8/1/2018 9:34:22 PM #

With thanks! Valuable information!

Reply

Ermelinda Firkey
Ermelinda Firkey United States
8/1/2018 9:36:05 PM #

Don’t wear seat belts lest you drown in your own urine?

Reply

Carolyne Humenik
Carolyne Humenik United States
8/1/2018 10:23:04 PM #

Don’t wear seat belts lest you drown in your own urine?

Reply

Carolyne Humenik
Carolyne Humenik United States
8/2/2018 12:06:03 AM #

Don’t wear seat belts lest you drown in your own urine?

Reply

Ed Lamartina
Ed Lamartina United States
8/2/2018 1:46:53 AM #

With thanks! Valuable information!

Reply

Minh Einck
Minh Einck United States
8/9/2018 5:01:23 PM #

I have been checking out many of your stories and i can state pretty https://bzp65.com/

Reply

Roy Bissett
Roy Bissett United States
8/9/2018 5:01:25 PM #

This is a impressive story. Thanks! https://miso7700.com/

Reply

Alfonso Flakne
Alfonso Flakne United States
8/9/2018 5:57:13 PM #

Black on black in the Charger I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini http://bnuphoto.com

Reply

Micheal Yuill
Micheal Yuill United States
8/9/2018 6:14:34 PM #

Don’t wear seat belts lest you drown in you own urine? https://newone2017.com/

Reply

Tyler Suttles
Tyler Suttles United States
8/9/2018 6:26:15 PM #

Don’t wear seat belts lest you drown in your own urine? https://php665.com/

Reply

Roland Heaton
Roland Heaton United States
8/9/2018 8:00:25 PM #

I conceive this web site has got some real good information for everyone http://casinossir.com

Reply

Andres Mcgrory
Andres Mcgrory United States
8/11/2018 2:37:12 PM #

I have been checking out many of your stories and i can state pretty http://bambam365.com/

Reply

Jacalyn Gallob
Jacalyn Gallob United States
8/13/2018 11:15:10 PM #

It?s hard to come by knowledgeable people on this subject, however, you https://bzp65.com/

Reply

Adam Pfingsten
Adam Pfingsten United States
8/14/2018 1:50:48 PM #

With thanks! Valuable information! https://bzp65.com/

Reply

Arlene Lobosco
Arlene Lobosco United States
8/14/2018 3:34:28 PM #

s he. Breen. He's traipsing all round Dublin with a postcard someone sent him with U. p: up on it to take a li... And he doubled up. Take a what? says I. Libel action, says he, for ten thousand pounds. O hell! says I. The bloody mongrel began to growl that'd put the fear of God in you seeing somethi<br>and visit my page : 우리카지노 https://gam77.xyz/우리카지노

Reply

Porter Rienstra
Porter Rienstra United States
8/14/2018 3:59:20 PM #

m fall in love with her, make him forget the memory of the past. Then mayhap he would embrace her gently, like a real man, crushing her soft body to him, and love her, his ownest girlie, for herself alone. Refuge of sinners. Comfortress of the afflicted. Ora pro nobis. Well has it been said that whosoever prays to <br>and visit my page : 우리카지노 https://gam77.xyz/우리카지노-2

Reply

Melissia Senst
Melissia Senst United States
8/14/2018 11:39:06 PM #

Don’t wear seat belts lest you drown in your own urine? https://bzp65.com/

Reply

Mariana Cancro
Mariana Cancro United States
8/15/2018 4:49:27 AM #

Simply a smiling visitant here to share the love (:, btw outstanding design and style. "Individuals may form communities, but it is institutions alone that can create a nation." by Benjamin Disraeli.

Reply

Dane Tinnel
Dane Tinnel United States
8/15/2018 3:30:54 PM #

Black on black in the Charger I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini https://bzp65.com/

Reply

Carey Pauley
Carey Pauley United States
8/17/2018 8:00:42 AM #

Don’t wear seat belts lest you drown in you own urine? https://php665.com/

Reply

Mildred Stroik
Mildred Stroik United States
8/17/2018 4:03:43 PM #

I conceive this web site has got some real good information for everyone https://bzp65.com/

Reply

Milan Willenbrock
Milan Willenbrock United States
8/20/2018 12:59:19 AM #

Don’t wear seat belts lest you drown in you own urine? https://php665.com/

Reply

Mauricio Fellman
Mauricio Fellman United States
8/20/2018 4:52:15 AM #

With thanks! Valuable information! https://bzp65.com/

Reply

Edwardo Taran
Edwardo Taran United States
8/20/2018 9:36:02 AM #

Don’t wear seat belts lest you drown in you own urine? https://php665.com/

Reply

tu van xay dung nha o
tu van xay dung nha o United States
8/25/2018 2:14:30 AM #

Great post, you have pointed out some great points, I besides think this s a very great website.

Reply

Pamula Pizzini
Pamula Pizzini United States
8/29/2018 9:32:26 AM #

Don’t wear seat belts lest you drown in you own urine? https://newone2017.com/

Reply

Brice Mostafavi
Brice Mostafavi United States
8/29/2018 3:50:07 PM #

Don’t wear seat belts lest you drown in your own urine?

Reply

India Lieblong
India Lieblong United States
8/30/2018 12:47:38 PM #

Don’t wear seat belts lest you drown in your own urine? https://newone2017.com/

Reply

Augustine Degonia
Augustine Degonia United States
8/31/2018 6:47:41 AM #

With thanks! Valuable information!

Reply

Doreen Scorca
Doreen Scorca United States
9/1/2018 11:42:12 AM #

With thanks! Valuable information!

Reply

Jacque Tuccillo
Jacque Tuccillo United States
9/1/2018 11:42:24 AM #

I’m quite certain I’ll learn lots of new stuff right https://newone2017.com/

Reply

Romaine Bolon
Romaine Bolon United States
9/3/2018 5:56:09 PM #

Black on black in the Charger I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Kareem Beesley
Kareem Beesley United States
9/4/2018 4:39:11 PM #

I have been checking out many of your stories and i can state pretty https://newone2017.com/

Reply

Rodger Strem
Rodger Strem United States
9/5/2018 5:35:46 AM #

Black on black in the Charg I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Noah Mikola
Noah Mikola United States
9/5/2018 11:52:13 AM #

need help and money advice - go here http://n4udgsuyqgvaszza.onion

Reply

Kenneth Schmidbauer
Kenneth Schmidbauer United States
9/6/2018 12:44:07 PM #

With thanks! Valuable information!

Reply

Keturah Koeppe
Keturah Koeppe United States
9/6/2018 12:53:41 PM #

Black on black in the Charg I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini https://newone2017.com/

Reply

Theressa Bleier
Theressa Bleier United States
9/6/2018 3:26:57 PM #

I have got 3 already from here - http://http://n4udgsuyqgvaszza.onion

Reply

Natashia Stjulian
Natashia Stjulian United States
9/8/2018 4:55:58 PM #

With thanks! Valuable information! https://newone2017.com/

Reply

China Lakes
China Lakes United States
9/10/2018 11:51:46 AM #

With thanks! Valuable information!

Reply

Bernardo Diesi
Bernardo Diesi United States
9/10/2018 5:10:14 PM #

I’m quite certain I’ll learn lots of new stuff right https://newone2017.com/

Reply

Hettie Roff
Hettie Roff United States
9/10/2018 6:10:53 PM #

If your boyfriend is cheating - hire hackers Wild hacker crew - http://456bosfo4pgtbrv3.onion get proof. You must use TOR browser to access.Wild hacker crew

Reply

Kerri Cavins
Kerri Cavins United States
9/11/2018 1:39:15 PM #

Black on black in the Charger I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Pearly Stade
Pearly Stade United States
9/12/2018 11:02:13 AM #

This is a impressive story. Thanks! https://newone2017.com/

Reply

Twanda Teppo
Twanda Teppo United States
9/13/2018 9:22:44 PM #

of writing i am as well delighted to share my know-how here with colleagues. https://newone2017.com/

Reply

Kathlene Shankin
Kathlene Shankin United States
9/14/2018 10:36:08 AM #

Black on black in the Charger I'm creepin' Rub me the right way, you might get a genie B.o.B, black Houdini

Reply

Kayla Lagana
Kayla Lagana United States
9/15/2018 1:49:11 PM #

Don’t wear seat belts lest you drown in your own urine?

Reply

Paula Reyna
Paula Reyna United States
9/15/2018 7:42:47 PM #

I conceive this web site has got some real good information for everyone https://newone2017.com/

Reply

Hiram Czechowski
Hiram Czechowski United States
9/17/2018 7:22:23 AM #

Don’t wear seat belts lest you drown in your own urine?

Reply

Major Sarra
Major Sarra United States
9/17/2018 6:20:44 PM #

This is a impressive story. Thanks! https://newone2017.com/

Reply

Dana Vanlaar
Dana Vanlaar United States
9/20/2018 3:59:19 AM #

sound like you know what you?re talking about! Thanks https://newone2017.com/

Reply

Add comment

biuquote
  • Comment
  • Preview
Loading

Rel=Me

Month List

RecentComments

Comment RSS