Code Groups



September 23, 2007

How to Write High-Performance C# Code

Filed under: Code Groups — admin @ 1:10 pm

How to Write High-Performance C# Code
 

Writing code that runs quickly is sometimes at odds with writing code quickly. C.A.R. Hoare, computer science luminary and discoverer of the QuickSort algorithm, famously proclaimed, “Premature optimization is the root of all evil.” The extreme programming design principle of “You Aren’t Gonna Need It” (YAGNI) argues against implementing any features, including performance optimizations, until they’re needed.

Writing unnecessary code is undoubtedly bad for work efficiency. However, it’s important to realize that different situations have different needs. Code for vehicular real-time control systems has inherent up-front responsibilities for stability and performance that aren’t present in, say, a small one-off departmental application. Therefore, it’s more important in such code to optimize early and often.

Performance tuning for real-world applications often involves activities geared towards finding bottlenecks: in code, in the network transport layer, and at transaction boundaries. However, these techniques alone cannot solve the dreaded problem of uniformly slow code, which surfaces when large bottlenecks have been resolved but the code still exhibits inadequate performance. This is code that has been written without attention to correct usage, often by junior programmers, in the same style across whole modules or applications. Unfortunately, the best solution for this problem is to make sure that all programmers on a project follow correct coding practice when writing the code the first time; coding guidelines and good shared libraries help enormously.

This article presents helpful tips for writing in-process .NET managed code that performs well. It’s assumed that basic programming skills such as factoring control structures, pulling work outside of loops whenever possible, caching variables for reuse, use of the switch statement, and the like are known to the average reader.

All code examples referred to in this article can be downloaded from the .NET Developer’s Journal Web site, at www.sys-con.com/dotnet/sourcec.cfm. The code comes with a Windows Forms application that can be used to easily view the code and run all the tests on your own machine. You’ll need the .NET Runtime 1.1 to run the code.

Tools
While testing tools such as NUnit and the upcoming VS.NET 2005 Team System can help you find bottlenecks, when tuning small sections of code, there’s still no substitute for the micro-benchmark. This is because most generic testing frameworks depend on things like delegates, attributes, and/or interface method calls to do testing, and the code usually is not written with benchmarking primarily in mind. This can be very significant if you’re interested in measuring the execution time of a batch of code down to the microsecond or even nanosecond level.

A micro-benchmark consists of a tight loop isolating the code that’s being tested for performance, with a time reading before and after. When the test has finished, the start time is subtracted from the end time, and this duration is divided by the number of iterations to get the per-iteration time cost. The following code shows a simple micro-benchmark construct:

int loopCount = 1000000000;long startTime, endTime;double nanoseconds;startTime = DateTime.Now.Ticks * 100;for(int x = 0; x < loopCount; x++) { // put the code to be tested here}endTime = DateTime.Now.Ticks * 100;nanoseconds = ((double)(endTime - startTime)) / ((double)loopCount);Console.WriteLine(nanoseconds.ToString(”F”) + ” ns per operation”);

When performing a simple micro-benchmark, it’s important to remember a couple of things. First, small fluctuations (noise) are normal, so to obtain the most accurate results, each test should be run several times. In particular, the first set of tests executed after program initialization may be skewed due to the lazy acquisition of resources by the .NET runtime. Also, if your results are very inconsistent, you may not have penetrated the “noise floor” of the measurement. The best solution for this is to increase the number of loops and/or tests. Another thing to remember is that looping itself introduces overhead, and for the most accurate readings, you should subtract this from the result. On a P4-M 2-GHz laptop, the per-loop overhead for a for loop with an int counter in release mode is around 1 nanosecond.

I’d never advocate running each code fragment from a long program through micro-benchmarks, but benchmarking is a good way to become familiar with the relative costs of different types of expressions. True knowledge of the performance of your code is built on actual observations. As time goes on, you’ll find yourself needing such tests less and less, and you’ll keep track in the back of your head of the relative performance of the statements you’re writing.

Another important tool is ildasm.exe, the IL disassembler. With it, you can inspect the IL of your release builds to see if your assumptions are correct about what’s going on under the covers. IL is not hard to read for a person familiar with the .NET framework; if you’re interested in learning more, I suggest starting with Serge Lidin’s book on the subject.

A great free tool for decompiling IL to C# or VB source, Reflector, is found at www.aisto.com/roeder/dotnet/; it’s incredibly useful for viewing code that ships with the .NET Framework, for those of you less familiar with IL.

The CLR Profiler, available as a free download from Microsoft’s Web site, allows you to track memory allocation and garbage collection activity, among other useful features. Also, the MSDN Web site has excellent coverage of performance metrics tools such as WMI and performance counters.

Working with Objects and Value Types
Objects: A Double Whammy
Objects are expensive to use, partly because of the overhead involved in allocating memory from the heap (which is actually well-optimized in .NET) and partly because every created object must eventually be destroyed. The destruction of an object may take longer than its creation and initialization, especially if the class contains a custom finalization routine. Also, the garbage collector runs in an indeterministic way; there’s no guarantee that an object’s memory will be immediately reclaimed when it goes out of scope, and until it’s collected, this wasted memory can adversely affect performance.

The Garbage Collector in a Nutshell
It’s necessary to understand garbage collection to appreciate the full impact of using objects. The single most important fact to know about the garbage collector is that it divides objects into three “generations”: 0, 1, and 2. Every object starts out in generation 0; if it survives (if at least one reference is maintained) long enough, it goes to 1; much later, it transitions to 2. The cost of collecting an object increases with each generation. For this reason, it’s important to avoid creating unnecessary objects, and to destroy each reference as quickly as possible. The objects that are left will often be long-lived and won’t be destroyed until application shutdown.

Lazy Instantiation/Initialization
The Singleton design pattern is often used to provide a single global instance of a class. Sometimes it’s the case that a particular singleton won’t be needed during an application run. It’s generally good practice to delay the creation of any object until it’s needed, unless there’s a specific need to the contrary - for instance, to pre-cache slow-initializing objects such as database connections. The “double-checked locking” pattern is useful in these situations, as a way to avoid synchronization and still ensure that a needed action is only performed once. Lazy initialization is a technique that can enhance the performance of an entire application through object reduction.

Avoiding Use of Class Destructors
Class destructors (implemented as the Finalize() method in VB.NET) cause extra overhead for the garbage collector, because it must track which objects have been finalized before their memory can be reclaimed. I’ve never had a need for finalizers in a purely managed application.

Casting and Boxing/Unboxing Overhead
Casting is the dynamic conversion of a type at runtime to another, and boxing is the creation of a reference wrapper for a value type (unboxing being the conversion back to the wrapped value type). The overhead of both is most heavily felt in collections classes, as they all - with the exception of certain specialized ones like StringDictionary - store each value as an Object. For instance, when you store an Int32 in an ArrayList, it is first boxed (wrapped in an object) when it is inserted; each time the value is read, it is unboxed before it is returned to the calling code.

This will be fixed in the next version of .NET with the introduction of generics, but for now you can avoid it by creating strongly typed collections and by typing variables and parameters as strongly as possible. If you’re unsure about whether or not boxing/unboxing is taking place, you can check the IL of your code for appearances of the box and unbox keywords.

Trusting the Garbage Collector
Programmers new to .NET sometimes worry about memory allocation to the point that they explicitly invoke System.GC.Collect(). Garbage collection is a fairly expensive process, and it usually works best when left to its own devices. The .NET garbage collection scheme can intentionally delay reclamation of objects until memory is available, and in particular longer-lived objects (those that make it to generation 1 or 2) may not be reclaimed for an extended period. Even a simple “Hello, world!” console application may allocate 15 MB or more of memory for its “working set.” My advice: don’t call GC.Collect() unless you really know what you’re doing.

Properties, Methods, and Delegates
Avoiding Overuse of Property Getters and Setters
Most people don’t realize that property getters and setters are similar to methods when it comes to overhead; it’s mainly syntax that differentiates them. A non-virtual property getter or setter that contains no instructions other than the field access will be inlined by the compiler, but in many other cases, this isn’t possible. You should carefully consider your use of properties; from inside a class, access fields directly (if possible), and never blindly call properties repeatedly without storing the value in a variable. All that said, this doesn’t mean that you should use public fields! Example 1 demonstrates the performance of properties and field access in several common situations.

About Delegates
Delegates are slower to execute than interface methods. Delegates are often used to introduce a level of indirection in code, but in almost all cases interfaces allow a cleaner design. Of course, it’s impossible to completely shun delegates; the entire event-handling paradigm in .NET is based on them. Example 2 compares the performance of delegates and direct method calls.

Minimizing Method Calls
The .NET compiler is capable of performing many optimizations for release builds. One of them is called “method inlining.” If method A calls method B and certain other conditions are met, such as the code in method B being small enough, the code from B will be copied into A during compilation. However, .NET won’t or can’t inline certain types of methods, such as virtual methods or methods over a certain size. Each method invocation/property access entails significant overhead, such as the allocation of a stack frame, etc. Of course, you should never repeatedly call a method for the same result on purpose, but you should also be mindful of the impact of method calls in general.

Using the ‘Sealed’ Keyword
Wherever extensibility is not required, you should use the sealed keyword. This makes your design easier to understand, as someone can tell at a glance if a certain class or method isn’t meant to be extended or overridden. It also increases the chances that the compiler will inline code.

Working with Collections
Avoid Overuse of Collections
This might sound strange, but I’m not advocating working without data structures. The fact is, I’ve seen collections used many times when they don’t actually simplify the code or provide any benefit at all. The single biggest avoidable use of collections is the use of an ArrayList when a simple array would suffice. It should be obvious that there’s no way that calling a collection method - which may do significant work under the covers - can compare to something as simple as an array access for performance. See Example 3 for more information.

for vs foreach
The rumor abounds that the foreach loop is bad for performance. The truth is actually a little more complicated. Basically, foreach involves no performance penalty when used against arrays. However, when used against lists it involves the same overhead as creating an enumerator and using it within a try/catch block! Ildasm.exe may come in handy here to see what’s going on. This isn’t a complete killer, but if you do enough list access you may want to avoid it. Example 4 compares the two statements for access against an array and an ArrayList.

Enumerators: Don’t Go Overboard
Just because the possibility exists for the enumerating of a collection doesn’t mean you have to do it. For instance, the ArrayList class is useful as an array replacement; one of its best features is indexed element access. By using an enumerator with ArrayList, you hide its most useful features and introduce needless overhead. Example 5 shows the performance difference between indexed access and the use of an enumerator.

Avoid Overuse of Collection Wrappers
A peek at the code in classes such as ArrayList shows that, to implement synchronized, fixed-size, and read-only versions of these, methods such as Synchronized() actually create a new wrapper list around the original one (this scheme was copied from Java). While this is nice from certain design standpoints, it degrades performance; the method-call overhead for each operation is multiplied. For a fixed-size, synchronized ArrayList, this overhead is tripled! Chances are, if you’re working with a collection and need synchronization, the code using the collection is already synchronized. In any case, simply locking on the collection itself around every access turns out to be faster than using a synchronized wrapper. Example 6 compares the use of a synchronized ArrayList with synchronizing access to an ArrayList.

Working With Strings
Don’t Use String.Format() to Concatenate Strings
While string-formatting routines built into .NET are very useful for globalization and other tasks, they’re not meant to be used for appending strings to each other. Example 7 tests the performance difference between String.Format() and string concatenation.

Use StringBuilder to Build Strings Inside Loops
The StringBuilder class is basically an array list for string fragments; the StringBuilder takes care of expanding its internal char array, hiding this from the user. The use of this class is also specially optimized by the .NET compiler, making it impossible to duplicate this functionality with equivalent performance (for instance, by manipulating char arrays directly and converting to a string afterwards). Example 8 shows the performance benefit of building a large string using StringBuilder instead of string concatenation.

Don’t Use StringBuilder to Concatenate Small Numbers of Strings
Many .NET developers who consider themselves well-versed in performance matters advocate the use of the StringBuilder class whenever possible. However, it’s not the fastest approach for concatenating small numbers of strings. Actually, any number can be combined in a single statement, although the performance benefit tends to dwindle above five or six substrings. This is due to instantiation and destruction overhead for the StringBuilder instance, as well as method-call overhead involved in calling Append() once for every added substring and ToString() once the string is built. What are the alternatives? Plus-sign concatenation and the String.Concat() method are equivalent; I prefer plus signs for readability. Note that this cannot be used across loops because the entire concatenation must occur within a single statement. Example 9 tests String.Concat() vs. StringBuilder for various numbers of substrings.

Don’t Be Afraid to Use String Literals
Many developers incorrectly assume that a new object is created for every string literal, and, therefore, avoid their use. In some cases, using string literals directly in your code is a better approach than using string constants! It can make the code easier to understand and has no adverse impact on performance. This is due to the use of the .NET interned string table; this table maintains a String instance for every known string and reuses this instance whenever the same character sequence is used as a literal. See the documentation of the String.Intern() method for more details. Example 10 compares string literals to the use of string constants.

Threading
In itself, this is a huge topic. Most easy-to-apply, synchronization-related optimizations focus on minimizing the amount of code executing inside synchronized blocks, which may involve moving some code from inside to outside such blocks. In some cases, thoughtful programming may allow elimination of synchronization entirely from a class (see “Immutable Objects”).

Performing a multithreaded micro-benchmark is more complicated than running a simple loop. In the simplest method, multiple threads are spawned, each looping over the benchmarked code; the reading is not started until all threads are successfully executing the code, and is terminated before the threads are shut down.

Thread Reuse
Newbie programmers make the common mistake of spawning a new thread for every request or other action. This can result in worse performance than using a single-threaded approach; the relative performance degradation is worse the quicker the individual requests can be serviced.

Writing Your Own Threading Code
Even better than the .NET thread pool, with its dependence on delegates, is to write your own threading code. Instead of using QueueUserWorkItem(), you typically write your own queueing code to coordinate work items. This also allows other benefits such as priority-based queueing.

Immutable Objects
Immutable objects are objects in which the data cannot be changed. In most cases, this is achieved by setting all fields in constructor methods and providing only property getters and/or methods that retrieve data from the object, without any mutator logic whatsoever. Many classes in the .NET Common Type System are immutable: System.String, System. Drawing.Font, etc. In addition, care should be taken that any values returned from property accessors, etc. are immutable as well. Otherwise, this data may be copied to insure the integrity of the object itself. Example 11 shows the performance benefit of immutable objects over synchronization.

Data Copying
This flies in the face of the advice given earlier, to minimize the use of objects. However, it’s really the other side of the coin from immutable objects. Object copying allows you to use the data in a non-immutable object, but in a way that still completely avoids synchronization. The more highly multithreaded the environment, the more strategies like this make sense.

Read-Write Locks
Synchronization issues in managed code mirror those in databases. In some situations, optimistic concurrency strategies can be used; in some dirty reads are acceptable, etc. For situations in which a structure is seldom updated and often read, the ReaderWriterLock class can give significant performance benefits over simple synchronization. It allows either multiple read access or single write access at once. Example 12 compares ReaderWriterLock to simple synchronization in a read-heavy scenario.

Minimizing Synchronized Blocks
The use of the [MethodImpl Attribute(MethodImplOptions.Synchronized)]attribute should be avoided, as it always locks an entire method and is also non-standard C# usage. Instead, the lock keyword or one of the System.Threading classes should be used. Wherever possible, adjust the start of a synchronized section forward and the end backward. Do whatever you can to decrease the number of synchronized operations.

Suggested Reading

  • Lidin, Serge. (2002). Inside Microsoft .NET IL Assembler: Microsoft Press.
  • Archer, Tom, and Whitechapel, Andrew. (2002). Inside C#, Second Edition. Microsoft Press.
  • Rico Mariani’s Weblog: http://blogs.msdn.com/ricom
  • Garbage Collector Basics and Performance Hints: dotnetgcbasics.asp
  • Improving .NET Application Performance and Scalability: scalenet.asp
  • An Introduction to C# Generics: csharp_generics.asp
  • WikiWikiWeb: http://c2.com/cgi/wiki?UniformlySlowCode

  • No Comments »

    No comments yet.

    RSS feed for comments on this post. TrackBack URL

    Leave a comment

    You must be logged in to post a comment.

    Powered by WordPress

    Close
    E-mail It
    sildenafil intravenous 1.0 mg ml tramadol 100mg 180 phentermine pill journals quizilla diet inexpensive phentermine pill drug interaction soma order cialis now viagra merchandise purchase phentermine no rx valium stage fright interview propecia in the uk ambien pill phenteramine and xenical who are the makers of xanax kava and ativan sildenafil plant buying xanax in china wellbutrin drug facts levitrabuy cheap levitra online names of plants in medicinal soma generic forms of wellbutrin viagra flowlan ambien cr cheap low price ultram controlled substance clomiphene drug generic ambien paid by american express wellbutrin and hair loss and regrowth ativan to clonazepam taper adipex chronic fatigue valium dosage for dogs male enhancement viagra 30ml phentermine no script ultram abuse chewing alprazolam next day amoxicillin dose for children soma fedex oklahoma urine drug testing of tramadol viagra and ejaculating xenical orlistat soma testing buy phentermine online with paypal withdrawing off xanax soma wireless other names for phentermine tamoxifen clomiphene canada making ambien work better where does amoxicillin come from online physicians prescribe phentermine what is tramadol hci greek phentermine phentermine 37.5 overnight comparing tadalafil valium diarreah tramadol review wellbutrin withdrawl symptoms phentermine online next day valium buy generic valium now save xanax no perscription amoxicillin when they expire buy i e online soma meridia phentermine vs man on viagra bangs his wife ambien and reflux online medications viagra ambien 10mg 90 pills generic order phentermine cap evista heavyweight teams case cialis sales uk do not mix cialis with prednasone cheap phentermine no prescription ambien canadian drug ultram daily for fibromyalgia cash for tramadol buy adipex order adipex get next day ambien prescription on line zenegra sildenafil citrate india zyban fungicide adipex bontril ionamin meridia phentermine xenical levitra discoumt wellbutrin for chemo fatigue shingles and paxil discount canadian cialis ambien vs ambien er ultram infomration wellbutrin and sweating alpha blockers and viagra interaction paxil cr withdrawla symptoms glucophage phentermine us meds buy viagra online purchase what does viagra do codeine version of fioricet is ativan an opioid adipex 37.5 online prescription sildenafil venlafaxine female sexual dysfunction paxil cm phentermine 90 online missouri side effect of viagra ultram lawsuit codine version of fioricet fioricet and pregnancy online pharmacy discount generic viagra usa rx no prescription phentermine adipex fosamax for dogs celecoxib pills buy vicodin and ambien online xanax varient angina new york walk in viagra prescription does paxil increase tolerance for alcohol who discovered xanax how to stop taking paxil cheap tramadol free shipping dutch xanax 1mg 100 tabs $39 viagra without a prescrition phentermine made overseas alprazolam solubility glucophage abuse nicotine valium vicodin marijuana adenoma prevention with celecoxib phendimetrazine and phentermine does valium contain gluten picture of xanax 1mg one for health viagra soma mou mp3 valium 10 alprazolam acetonitrile effects of the drug xanax 2mg xanax bars no prescription canadian approved female viagra copy viagra cialis and hair loss buy tadalafil refill zolpidem tartrate ambien valium experience erowid next dat delivery generic viagra cheap phentermine no subscription adderall green tea levitra fallon health plan fioricet tramadol dose of 300 mg india's names for alprazolam valium for fear of flying xanax convulsions seroxat blackout alcohol memory loss paxil mexico and viagra hair loss teenager propecia 5mg xanax too much clinical trial on ativan efficacy safety discovered valium generic sample pacs of viagra online phentermine online on line pharmacies selling soma substitute for ambien cr cialis information from drugs com ambien cr and achohol xenical weight loss information information download viagra song adipex pills for free generic viagra without a prescription xanax birth control pills erectile dysfunction cialis withdrawal symptoms fom tramadol wellbutrin research sildenafil tgp buy xanax on line no percription prescribed uses of ativan i need to buy propecia buying viagra without a prescription alprazolam about alprazolam drug when does phentermine start to work tramadol express delivery erection dysfunction viagra viagra puns xanax on-line viagra brand vipps cod line soma phentermine no prescription phentermine free consult overcounter viagra hyoscyamine and wellbutrin add paxil how soma workd tadalafil generic apc alis chantix and wellbutrin together clomiphene citrate sperm signs of addiction to somas purchase ativan online no prescription who sells phentermine xanax treatment for borderline personality disorder liposuction and xenical soma 724 fosamax safety cornea paxil internet pharmacy fast cheap ativan fioricet fiorinal problems with levitra propecia and alopecia areata finalcial help for wellbutrin music ashes of soma viagra fro women international valium phentermine medical details tramadol metabolite how to get high on valium viagra 100mg usage how long ativan stays in system drug interaction between amiodarone and tramadol wellbutrin xl and headaches opinions on propecia where to get real phentermine online paxil cr 25 rx wellbutrin tablets lisinopril viagra interaction fosamax plus stratege viagra doctor bite hard should i take propecia topica phentermine cialis and testosterone heather viagra grow pros and cons of wellbutrin funny viagra jokes what company manufactures ambien viagra sa low cost propecia ativan drug company zyban opinions paroxetine paxil international name equivalent yellow phentermine fedex order soma online cheap prescription xanax online withdrawal zyban viagra adverse events paxil manufacturer buy xanax overnight delivery levitracialis compare levitra alprazolam overdose wellbutrin how does it work cheap ionamin with no prescription phentermine viagra online overnight delivery show ambien 12.5 mg ordering phentermine levitra cha adult dosing amoxicillin xanax before public speaking natural phentermine valium or xanax easy november choose wellbutrin for quitting smoking head bleed valium jind mahi lyrics tramadol ambien cr what is it tramadol free online consultation levitra fast overnight delivery usa only meridia and phentermine combination low price viagra cialis release news addiction to soma buy viagra in london valium driving men and paxil and conception weight loss program for phentermine weaning from alprazolam propecia effects on male babies multiple orgasms with viagra phentremine and phentermine phentermine script online tramadol muscles calf dangers of finasteride and cialis xanax in china paxil and low sex drive propecia online prescriptions picture of xanax pill xanax gold bars soma dasgupta paxil erections xanax alprazolam no prescription cialis advertising buy no phentermine prescription ionamin side effects xenical side affect stimulation with 20 mg levitra wellbutrin guidelines switch and paxil to prozac viagra used for lung disease medlineplus drug information sildenafil systemic alprazolam mg phentermine alternative levitra vardenafil hci tablets online phentermine purchase zyban counterindications valium without prescription s paxil and alcohol's effects the viagra song ambien dependence 93 3109 pill amoxicillin alprazolam 50g tin tramadol hci give for viagra etc 1 50mg tramadol pfizer xanax 1 mg pictures buy vardenafil purchase vardenafil vardenafil tadalafil 5 sildenafil citrate 100mg plus bosentan and sildenafil and neonate what is tramadol apap wellbutrin makes me really irritable cialis erection problems viagra magazine advertisement behavioral side effects of viagra naion blindness sildenafil adipex 37.5 without a prescription foreign generic viagra amoxicillin for fish aquariums amoxicillin sodium market valium fed ex consultation mail order viagra online new natural viagra product buy online us viagra commercial cialis what type of drug is propecia customhrt closed where to order phentermine buying fioricet can viagra hurt younger males cheap adipex online order now order xanax now visa zyban canada order tramadol cymbalta phentermine lewisville denton generic viagra by mail non-prescription xenical valium mother chelsea duration of xanax withdrawal levitra be ordered in usa use of valium on children ativan tbx no prescription ambien naked mitsuko soma somas sent cod do zoloft and xanax interact uk viagra supplier ambien day next flexeril vs tramadol ultram urine test watson generic tramadol tadalis edegra generic cialis soma bike safe dose of wellbutrin treating add with wellbutrin 20mg tadalafil x 120pills retail viagra valium generic name propecia and frontal cheap phentermine without dr prescription buy cialis tadalafil at horizon drugs viagra allergic reactions order phentermine 37.5 180 soma water bed tubes discount zyban shipping viagra to australia adipex meridia phentermine xenical phentermine pill buy cheap phentermine phentermine equivalents cialis uk order cialis online cialis evista medication for bones bad side effects from wellbutrin viagra free trial pack soma rockbottomprices adipex miami viagra misuse cost of ambien cr 12.5 discount levitra pharmacy purchase ambien phone calls canine paxil paxil and heavy sweating ambien free offer evista nova cola amoxicillin biaxin mixing drug contradiction with sildenafil viagra and levitra comparisons tramadol pee test amoxicillin trihydrate capsules 500mg list of pharmacies selling phentermine dream online pharmaceutical tramadol phentermine weight loss pharmacy online fosamax manuf purpose of zithromax phentermine problem tramadol great buy children taking ambien zithromax causes dehydration xanax in doha suing ativan doxylamine succinate vs ambien where buy phentermine celecoxib recalled picture of tramadol pill ultram er high doses 700 mg 40 grams of cialis tinnitus and ambien cr xenical image ambien hypnotics long term use dr consultation phentermine soma drug catagory introducing sildenafil citrate soft tabs soma conference tampa prescription drug viagra klonopin vs ativan per mg propecia tampa adipex p 37.5 online paxil psoriasis overdose from paxil does phentermine have mental side effectrs tramadol uk buy viagra on the internet xanax going out of im a fake soma does amoxicillin treat urine infections averages doses of wellbutrin zolof and wellbutrin genaric for xanax how is ativan absorbed purchase phentermine from internet source tramadol 50mg tablet ambien express shipping to germany valium addiction abuse phentermine cp cost of viagra pill wellbutrin backache active ingredient in cialis xanax xr abuse quit smoking and paxil ultram tramadol hci tablets cheapest phentermine onine viagra medicinal how to get xanax tramadol 650 37.5 phentermine cod xanax no prescription drug side effects soma lyrica and tramadol contraindications prozac phentermine weight loss generic viagra vidrin ultram what is it adipex brand name medication 150 generic cialis softtabs power-surge paxil success cheapest online adipex old men viagra videos length of weight loss on phentermine phentermine cheep ambien home belair amoxicillin skin treatment flushed face viagra over the counter drug to viagra viagra nasal valium causes suicide prepare tramadol for intravenous injection buy kamagra viagra suicide and ambien addiction psychiatrist prescribed ambien symptoms treated by wellbutrin wellbutrin price per pill uk online pharmacy phentermine levitra comparisons phentermine cheaper paxil digestive side effects phentermine prescription discount xenical hgh phentermine qu it smoking phentermine online effects phentermine side no prescription phentermine no mexico pharmacy xanax prescription wellbutrin evaluation zoloft glucophage adipex combination wellbutrin with lexapro or paxil discount ultram rx ambien in the brain injury patient vetinary amoxicillin ativan side effects uses cheap xanax free doctor consultation were do they get sildenafil citrate propecia hair treatmen ambien patent expired tramadol experiences treatment of periorbital cellulitis with amoxicillin tramadol all about phentermine definition and much more levitra cialis for women purchase phentermine without a prescription fortamet glucophage lawsuit wellbutrin sleepy side effect ambien and celexa lexapro wellbutrin buy sale purchase discount xanax depression tramadol redose medlineplus drug information phentermine paxil or effexor soma development llc generic fosamax sa perscribed xanax viagra sex video xanax online consultation shipped ups viagra for female when was evista invented buy xanax online without script search propecia phentermine mg tablet pharmacy online side effects of drug alprazolam 37.5 adipex p zyban canadian pharmacy generic names for wellbutrin antidepressant phentermine green and white capsules wider xanax wellbutrin side effects appetite cost levitra lowest stop taking paxil tips cheap cialis 32 amoxicillin clavulanate potassium chewable child dosage xanax and preganancy wellbutrin and suicide china phentermine xanax bars photos when is viagra generic overdose of valium kill easy buy viagra online what is generic wellbutrin paxil support buy xanax online cheap scottish civic trust viagra charles wellbutrin sr and weight loss no doctor phentermine combining ecstasy with viagra xanax dosage dog zyban and sexual side effects celecoxib sulfa allergy cialis effect on blood pressure adipex p 37.5 why stop glucophage after ct scan o0 mg phentermine no prescription allergic reaction amoxicillin rash levitra dosing levitra adipex childrensmuseumofoakridge org adipex online free mexican pharmacies online adipex wellbutrin food contraindications pravachol bontril aciphex nasacort propecia description of xanax dui's for xanax what is ultram er works like a dream ambien purchase celecoxib on the net tramadol acetaminophen pill identification 537 tadalafil ciales india powdered ambien eye problems cialis viagra free shipping class action suit against paxil funny valium pics natural alternatives to phentermine buying zyban phentermine actos claritin d hr 13 generic ambien list xanax to relax urethral spasms paxil for hot flashes alprazolam generic ultram and buspar using propecia viagra compare prices feline amoxicillin viagra misleading viagra diary joke multiple sexual attempts viagra dosage by weight amoxicillin ambien sex life sildenafil for pulmonary hypertension wellbutrin instructions phentermine overnight no prescription xanax how long in your system generic wellbutrin sr reviews buy cialis fedex shipping soma 350mg 180 xanax history flacid propecia levitra acts ambien re vs xanax propecia side effects rogaine 1 mg of xanax to fly treating gonorrhea zithromax pde6 tadalafil clomiphene citrate powder capsules cheap cycle xanax high gastric bypass use levitra boots sell viagra xanax help withdrawal symptoms ambien mental illness tramadol effects feeling metformin stories how safe is phentermine amoxicillin during pregnancy acyclovir famvir tramadol clarinex health mercy plan fioricet 1cheapest cialis clomiphene no prescription body withdrawal signs from paxil cr cheap canada generic levitra xanax terhess g ambien heartbeat ecstasy and xanax fosamax and dental hair loss propecia treatment tramadol replace for lortab danger of zyban wellbutrin consumer information when to prescribe wellbutrin or zoloft celecoxib heart attack cialis uk chemist phentermine medication side effects of generic wellbutrin how many teens use valium buy generic ativan paxil dizziness purchase xanax online offshore pharmacy phentermine yellow female injury with viagra viagra nitrolingual amoxicillin for fevers give a dog xanax zithromax for pneumonia can ambien cause weight loss ultram or tylenol without a prescription clarisa nora doctorovich viagra soma's rapid prompting method ultram er 300 mg viagra berocca cocktail tuft health plan paxil biochemistry of valium risks of taking viagra no doctor adipex tramadol free fedex cheap no rx clonipin and wellbutrin local viagra paxil and remron side effects discount viagra drug buy adipex from overseas pharmacies tramadol 180 overnight shipping zithromax non prescription levitra vs viagra acapulco viagra viagra sudden blindness tramadol 89.00 images of viagra ativan effects of valium drug info fda approved generic viagra sildenafil citrate how much does valium sell for antidepression medicine and adipex levitra commercial models amoxicillin tendon pain order somas real phentermine no dr prescription needed tramadol saturday cod viagra over the counter mexico wellbutrin half life loss of appetite with ativan phentermine no prescription phentermine order cheapest price tadalafil xanax dependance false positive drug screen for valium canada viagra for sale wellbutrin sr 150 no prescription viagra taken ranitidine generic name ambien tadalafil wellbutrin contraindications akane soma sexy video phentermine white blue tramadol 50ml zithromax no prescription viagra high blood presure what is better levitra viagra cialis adipex prescritpion ativan in emergency medicine fastin adipex ionamin viagra erection duration glucophage xr side effects phentermine with e check ativan prescription pharmacy online wellbutrin xl and vyvanse switching to ultram from tramadol pharmacology of ambien cialis male enhancement cat stress valium can dogs take ativan is tramadol a propoxyphene can i take soma with esgic phentermine and atrial fibrillation phentermine and prozac for weight loss cialis and viagra together adipex without permission male sexual performance with viagra valium usa no rx xanax dosage for canine generic somas causes overdose ambien and amnesia wellbutrin pravachol actos alphagan zyban stop denavir denavir xenical zyban tramadol and pregabalin composition 5money order sildenafil citrate 104 over night soma without rx valium and aliquot does adipex have ephedra in it clomiphene und dosierung viagra in the water blondes amoxicillin dose for sinusitis diet pill over the counter phentermine strongest phentermine ambien urine test tramadol pill identification where to puchase cialis online usa wine ambien ativan and depressed feelings purchase phentermine phentermine very cheap viagra canadian tv ad viagra 50mg online tramadol dreampharmaceuticalscom cialis genuinerx net viagra viagra viagra headaches 4.28 diet phentermine pill phentermine hcl medicine same as viagra over the counter permanent side effects ambien generic viagra pay later withdrawing from trazodone paxil and xanax doxycycline amoxicillin sinus australia pump up the valium mp3 pregnancy propecia phentermine erection depression alone flashlights made by soma enterprises buy ultram online dream pharmaceutical levitra result where to get viagra samples amoxicillin for cats no prescription positives side affects of taking wellbutrin levitra consumer reviews core trial evista viagra damage tramadol testicle pain re re cheap phentermine phentermine perscription online md making sildenafil citrate glucophage dose akane soma phentermine cod overnight delivery celecoxib selective cox 2 inhibitor phentermine nrop usa medical phentermine fosamax complic viagra alternatives sniff ativan buy cheap ativan online ligit pharmacy sells phentermine phentermine green and white capsule picutres fioricet with pregnancy pregnancy with soma viagra information facts and responses is tramadol an opioid valium 10 meds san francisco gay club soma propoxephene generic of ativan tramadol and back spasms paxil and gi xanax overnight fedex delivery hcg shots and phentermine dosage adipex brand wellbutrin causing pressure in eyes buy evista online dream pharmaceutical buy adipex with out rx viagra female warning generic tadalafil ativan contraindication generic ativan appearance black phentermine pain medication ultram 50 mg phentermine discount 30mg ultram and alcoholism viagra light switch cover viagra good morning what is the medicine ultram ambien stilnox stilnoct hypnogen zolfresh myslee can fioricet affect female fertility order ambien fedex overnight shipping tramadol time release genuine phentermine sildenafil nitrogen oxide seizures from tramadol paxil from india heart health paxil zolpidem ambien law clomiphene citrate precursor dissolution valium withdrawl seizures dog dosage xanax adipex retard phenterminum resinatum sildenafil hypertension pulmonar amoxicillin strep throat discount online phentermine without doctor buy generic adipex no rx cheap ambien big discounts viagra without a prescription off adipex and can't stop eating phentermine 30 mg c iv superior drugs phentermine 30 mg yellow buy ativan no prescription legally allergy to gluten cialis atavan ativan side effects ultram dosage guide anxiety disorders benzodiazepines xanax phentermine without a prescription overnight viagra's ad campaign weight loss with glucophage ultram liver online clomiphene manufacture of adipex soma watson brand starting wellbutrin sr roche valium express overnight delivery zyban rash how to get off ambien celecoxib over diclofenac tramadol by myla how does ambien work edinburgh viagra find order search ultram after first trimester concerta drug interactions with wellbutrin what are phentermine tablets for fedex overnight shipping xanax generic name valium xanax withdrwal symtoms xanax effect on neurons order valium next day delivery canada pharmacy chewable viagra onlinr tramadol drug xanax and alcohol discount phentermine pharmacy online order phentermine online pharmacy online does ambien cause dry mouth xanax withdrawal outpatient treatment south dakota antidote to side effect of valium cialis pills free shipping clomiphene contamination can selegiline be used with paxil viagra ordering dosage adipex retard phenterminum resinatum what does generic valium look like shop phentermine phentermine 37.5 discount no prescription can women take fosamax soma and track who invented viagra alpraxolam and phentermine online synthesis of valium alti alprazolam alti alprazolam can i purchase tadalafil online viagra useless viagra women study amoxicillin staph aureus tramadol cod sisters pharmacy fioricet withdrawal detox nicole richie valium evista tabs for osteoporosis stop resistence to phentermine cialis lowest prices on the internet cheapest generic fioricet online can xanax cause memory loss alternative for xanax tx of alzheimer's paxil and birth control what is phentermine hydrochloride liquid cialis fosamax jaw problems kyo soma pictures viagra eyes help paying for viagra ambien prescription purchase without buy ambien online canada cheapest roche xenical orlistat mg onsale how to take ativan ixing lexapro with xanax ultram generic tramadol solubility of amoxicillin trihydrate mixing xanax and propranolol paxil and general anesthesia arsen iod and wellbutrin order ambien american express differences in wellbutrin common side effects of wellbutrin tramadol sice effects drug testin valium xanax bar what is it valium get high cialis tadalis tadalafi nurofen plus la le soma wellbutrin pravachol actos heroin buy tadalafil discount xanax g3721 low cost discount phentermine asia generic viagra does evista help heart and osteoporosis tetracycline and amoxicillin cost for amoxicillin 30 capsules cheapest phentermine pill starting dosage for wellbutrin indian viagra karmagra cheap phentermine 37.5 no doctor consult active drug in viagra dr brandwein sildenafil internet pharmacy cialis buy online adipex pills online buy clomiphene on day 7 cialis and muscel cramps phentermine success story phenterminechik use xenical phentermine 37.5 90 ct no prescription viagra and women messed up on amoxicillin side effects from propecia overnight phentermine licensed pharmacies online alcohol xanax no prescription required phentermine buy cheap xanax at kalesaedu org glucophage hcl xr side effects no membership phentermine what is soma 3f function of soma in brain medical weight loss phentermine atlanta georgia herbal aphrodisiacs and natural viagra the penitration of levitra is minimal clomiphene citrate 40 how fast lose weight on wellbutrin ssri and ambien deadly mixture side effects of amoxicillin clavulanate tramadol used to treat amoxicillin and dosage how long ultram er withdrawls last how long does alprazolam work xanax overdose deaths propecia rogaine women want phentermine shipped 48hours blue cross propecia danger of fosamax generic cialis paypal payment adipex without a prescription needed ambien prices evista heart study soma drug classification wellbutrin curb eating wellbutrin side effects seizures tadalafil generic cheap cabergoline with sildenafil adipex pill west coast tramadol wellbutrin pravachol foradil paxil xanax is bad viagra sales poland levitra walmart pharmacy online mexico pharmacy ultram biggest size of xanax brand drug generic name viagra tadalafil male impotence drugs fioricet withdrawal how is generic form of ambien wellbutrin cymbalta wellbutrin for sugar cravings eckerds fosamax 2003 billion apcalis levitra market sale tramadol and long term effects discount alprazolam fedex 5 sildenafil soft tab valium cipro paxil scienticfic name phentermine no rz what is paxil described for ambien cr prescription amoxicillin acute generalised exanthematous pustulosis how to buy 10mg valium online compare diet pills adipex weight loss lawsuits on fosamax cafe soma cheapest zyban online soma finacial make tadalafil analogs wellbutrin side effects overdose compare ativan to valium facts about ambien cr compare or viagra oklahoma soma withdrawl phentermine strep throat and amoxicillin zyban nasonex phentermine under 100 1 pill zyban wellbutrin generic cheap xanax overnight delivery ambien questions mix vicodin with soma generic cialis online viagra complaints get xanax overnight will viagra help premature ejaculation what is lethal dose of xanax mobile home finance phentermine diet pill phentermine vagria cheap cialis online ativan heart failure cialis prescription required ambien cr and not sleeping zy