Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

1443
LINES

< > BotCompany Repo | #3000518 // Smart Bot's answer to: !fresh tikaText("http://www.drdobbs.com/cpp/increasing-compiler-speed-by-over-75/240158941")

New Tinybrain snippet

1  
[12575 ms] 
2  
			
3  
			
4  
		
5  
6  
				
7  
			
8  
		
9  
10  
	
11  
			
12  
			
13  
		
14  
15  
	
16  
17  
18  
		
19  
20  
21  
	
22  
	
23  
24  
	
25  
		   
26  
	   
27  
	    
28  
	  
29  
	    		Subscribe
30  
	Newsletters
31  
	Digital Library
32  
	RSS
33  
34  
	
35  
							
36  
		
37  
38  
    	
39  
		
40  
	
41  
		
42  
43  
44  
	
45  
		
46  
	
47  
48  
49  
	Search: 
50  
	 Site
51  
	 Source Code
52  
53  
	
54  
55  
	
56  
57  
		
58  
 	
59  
60  
61  
62  
	Home
63  
	Articles
64  
	News
65  
	Blogs
66  
	Source Code
67  
	Dobb's TV
68  
	Webinars & Events
69  
70  
71  
72  
73  
74  
75  
76  
77  
  	 	
78  
  		
79  
	
80  
81  
82  
  
83  
		
84  
85  
86  
87  
 
88  
 
89  
 
90  
91  
	
92  
	        Sections ▼
93  
					Home
94  
	Articles
95  
	News
96  
	Blogs
97  
	Source Code
98  
	Dobb's TV
99  
	Webinars & Events
100  
101  
	
102  
103  
  
104  
  
105  
  
106  
107  
108  
109  
110  
		
111  
112  
113  
114  
115  
116  
117  
118  
	
119  
	
120  
	
121  
			Cloud
122  
	Mobile
123  
	Parallel
124  
	.NET
125  
	JVM Languages
126  
	C/C++
127  
	Tools
128  
	Design
129  
	Testing
130  
	Web Dev
131  
	Jolt Awards
132  
133  
134  
135  
136  
	  
137  
138  
	
139  
	
140  
	        Channels ▼
141  
					Cloud
142  
	Mobile
143  
	Parallel
144  
	.NET
145  
	JVM Languages
146  
	C/C++
147  
	Tools
148  
	Design
149  
	Testing
150  
	Web Dev
151  
	Jolt Awards
152  
153  
	
154  
155  
  	
156  
	
157  
	
158  
					
159  
			
160  
		
161  
162  
		
163  
164  
	
165  
			
166  
		
167  
    
168  
    	  	
169  
			    	
170  
    	        
171  
	    	
172  
        
173  
            Walter Bright
174  
            
175  
            Dr. Dobb's Bloggers
176  
177  
        
178  
179  
    
180  
181  
    			
182  
    
183  
     
184  
        
185  
            
186  
                
187  
                	                    Bio |  Archive 
188  
                
189  
190  
                Walter Bright
191  
192  
            
193  
194  
             
195  
                
196  
        	            
197  
198  
199  
200  
        					  
201  
            
202  
203  
        
204  
205  
    
206  
207  
208  
209  
		
210  
				
211  
			
212  
213  
214  
215  
216  
217  
218  
219  
220  
221  
222  
223  
224  
225  
226  
227  
228  
229  
230  
231  
232  
233  
234  
235  
236  
237  
238  
239  
240  
241  
242  
243  
244  
245  
246  
247  
248  
249  
250  
	 
251  
	 
252  
				
253  
		    Tweet
254  
	
255  
        
256  
						 
257  
        					 
258  
		
259  
				    	 
260  
			
261  
		
262  
        
263  
			
264  
		
265  
266  
		         
267  
        		
268  
		
269  
		
270  
		
271  
		
272  
273  
		
274  
		
275  
		
276  
		
277  
		
278  
279  
				
280  
				
281  
		
282  
						 
283  
						
284  
						
285  
			 
286  
			
287  
			Permalink
288  
			
289  
290  
		
291  
292  
		
293  
		
294  
				
295  
	
296  
297  
	
298  
			
299  
300  
301  
302  
	
303  
304  
305  
306  
	
307  
		Increasing Compiler Speed by Over 75%
308  
309  
		 July 25, 2013
310  
311  
	
312  
313  
314  
315  
316  
D is designed to be a language that is amenable to fast compilation.
317  
318  
    
319  
320  
		    
321  
		
322  
	
323  
	
324  
325  
I began implementing compilers on painfully slow machines like the IBM PC, so having the compiler run fast was always a big deal. It got a lot of attention, and the compilers I wrote were known for being very fast. I naturally built the techniques learned along the way into the DMD D compiler, and D itself is designed to be a language that is amenable to fast compilation.
326  
327  
328  
329  
330  
331  
	
332  
More Insights
333  
334  
335  
336  
White Papers
337  
		 
338  
       
339  
			
340  
					
341  
				Managing Access to SaaS Applications				
342  
								
343  
			
344  
					
345  
				Rogue Wave Tools and Libraries for Big Data				
346  
								
347  
348  
349  
More >>Reports
350  
		 
351  
       
352  
			
353  
					
354  
				Hard Truths about Cloud Differences				
355  
								
356  
			
357  
					
358  
				Database Defenses				
359  
								
360  
361  
362  
More >>Webcasts
363  
		 
364  
       
365  
			
366  
					
367  
				Accelerate Cloud Computing Success with Open Standards				
368  
								
369  
			
370  
					
371  
				How to Create an End-to-End Enterprise Payments Hub				
372  
								
373  
374  
375  
More >>
376  
377  
378  
379  
This has been a big success for D, and many engineers have told me that D's compile speed was a huge factor in being seduced by D. Every big boost in compile speed has a transformative effect on the development process.
380  
381  
382  
383  
It's easy to get complacent and focus on other issues with DMD. Subtle  degradations in speed can creep in, especially with a lot of people contributing to the codebase. Compiling the D test suite was taking too much time — making that faster has a lot of leverage in improving productivity. In particular, some D code makes very heavy use of templates, and these were not compiling as fast as I'd like. The library module std.algorithm stood out.
384  
385  
386  
387  
The obvious low hanging fruit was that some templates were being instantiated 70,000 times or more. This is a problem well known among C++ compiler guys — given a template and the arguments to instantiate it, look to see if it's already been instantiated and simply point to the existing one. The lookup for this was, I'm ashamed to admit, a linear list. It's like dragging a block of concrete behind your sports car. Replacing this with a hash table netted a mere 10% improvement, I expected more. How disappointing.
388  
389  
390  
391  
My next idea revolved around the issue that templates, when instantiated, are given a string identifier that uniquely identifies them. You can see these names if you disassemble any template-using code written in C++ or D. They tend to be long, as they incorporate a "mangled" version of each and every template argument.
392  
393  
394  
395  
The thing is, an awful lot of templates are generated that never appear in the  generated code, as they are templates that produce a value or a type. These don't need generated identifiers. I switched the identifier generation to being lazy; i.e., only generated if needed by the object code generation. This also produced a perceptible improvement, but much more modest than I'd anticipated.
396  
397  
398  
399  
Time to stop guessing where the speed problems were, and start instrumenting. Time to trot out gprof, the Gnu profiler. I fired it up on the slow example, and waited. And waited, and waited, and waited. I waited overnight. It pole-axed my Ubuntu box, I had to cold boot it. The test case was so big that it plus gprof was too much. gprof slows things down a lot, so I had to cut things way down to get it to work.
400  
401  
402  
403  
The top three time-eating tasks were:
404  
405  
406  
407  
408  
	lexing
409  
410  
	hash table lookups
411  
412  
	storage allocation
413  
414  
415  
416  
417  
418  
Lexing has always been the succubus leaching the cycles out of a compiler. It's written with that in mind (and so is D's grammar), and I didn't see much more oil to be pressed out of that olive.
419  
420  
421  
422  
I figured hash table lookups would be high on the list, but not that high. DMD makes heavy use of hash tables internally. The symbol tables are all hash tables, the template instantiations are (now!), etc. Looking at the code, nothing too obvious stuck out:
423  
424  
425  
426  
    if (aa)
427  
    {
428  
        size_t len = aa->b_length;
429  
        size_t i = (size_t)key % len;
430  
        aaA* e = aa->b[i];
431  
        while (e)
432  
        {
433  
            if (key == e->key)
434  
                return e->value; // found
435  
            e = e->next;
436  
        }
437  
    }
438  
    return NULL;    // not found
439  
440  
441  
442  
443  
But there is something interesting about it — the key%len operation. Division is a notoriously expensive operation. I could replace it with a mask, but that supposedly leads to a not-so-uniform distribution. A few months back, I implemented in the compiler back end the optimization of replacing an integral divide by constant with a multiply by the reciprocal. [4] It's a lot faster, but here the denominator is a variable, and so I can't use that optimization.
444  
445  
446  
447  
Or can I? The denominator is a prime number pulled out of a table of primes:
448  
449  
450  
451  
    static const size_t prime_list[] = {
452  
              31UL,
453  
              97UL,            389UL,
454  
            1543UL,          6151UL,
455  
            24593UL,          98317UL,
456  
          393241UL,        1572869UL,
457  
          6291469UL,      25165843UL,
458  
        100663319UL,      402653189UL,
459  
      1610612741UL,    4294967291UL,
460  
    };
461  
462  
463  
464  
465  
If the hash table chains get too long, it is rehashed using a larger prime from this table. But most of the time, the symbol tables are small (every scope has its own symbol table). So I rewrote the key%len as:
466  
467  
468  
469  
    size_t i;
470  
    size_t len = aa->b_length;
471  
    if (len == 4)
472  
        i = (size_t)key & 3;
473  
    else if (len == 31)
474  
        i = (size_t)key % 31;
475  
    else
476  
        i = (size_t)key % len;
477  
478  
479  
480  
481  
The smallest bucket has a length of 4, the next larger size is 31. So, for the most common cases, the compiler is able to generate the fast modulo code because it's dividing by a known constant.
482  
483  
484  
485  
This change alone was worth a 5% speed boost. Not bad for 3 or 4 lines of code!
486  
487  
488  
489  
That left storage allocation.
490  
491  
492  
493  
Storage allocation is one of the great unsolved problems in programming. You can do manual allocation at the expense of endless pointer bugs. You can do reference counting with its performance problems and bloat. You can do garbage collection with its pausing and excessive memory consumption.
494  
495  
496  
497  
DMD does memory allocation in a bit of a sneaky way. Since compilers are short-lived programs, and speed is of the essence, DMD just mallocs away, and never frees. This eliminates the scaffolding and complexity of figuring out who owns the memory and when it should be released. (It has the downside of consuming all the resources of your machine if the module being compiled is big enough.)
498  
499  
500  
501  
But malloc() itself is designed with the presumption that the memory allocated will eventually get freed. Since it's not in DMD, I tried replacing the storage allocator with a dead simple bump-the-pointer greedy allocator:
502  
503  
504  
505  
    #define CHUNK_SIZE (4096 * 16)
506  
507  
    static size_t heapleft = 0;
508  
    static void *heapp;
509  
510  
    void * operator new(size_t m_size) {
511  
        // 16 byte alignment is better
512  
        // (and sometimes needed) for doubles
513  
        m_size = (m_size + 15) & ~15;
514  
515  
        // The layout of the code is selected so the
516  
        // most common case is straight through
517  
        if (m_size <= heapleft) {
518  
          L1:
519  
            heapleft -= m_size;
520  
            void *p = heapp;
521  
            heapp = (void *)((char *)heapp + m_size);
522  
            return p;
523  
        }
524  
525  
        if (m_size > CHUNK_SIZE) {
526  
            void *p = malloc(m_size);
527  
            if (p)
528  
                return p;
529  
            printf("Error: out of memory\n");
530  
            exit(EXIT_FAILURE);
531  
            return p;
532  
        }
533  
534  
        heapleft = CHUNK_SIZE;
535  
        heapp = malloc(CHUNK_SIZE);
536  
        if (!heapp) {
537  
            printf("Error: out of memory\n");
538  
            exit(EXIT_FAILURE);
539  
        }
540  
        goto L1;
541  
    }
542  
543  
    void operator delete(void *p) { }
544  
545  
546  
547  
548  
It's like I poured nitrous down the compiler's throat. Along with the other improvements, this achieved a near doubling of the compiler speed. (It even reduced the memory consumption somewhat, apparently because malloc() needed memory for its data structures.)
549  
550  
551  
552  
The benchmark used was compiling Phobos' std.algorithm for unit tests, which is:
553  
554  
555  
556  
    dmd std\algorithm -unittest –main
557  
558  
559  
560  
561  
dmd 2.063 does the nasty in 21.56 seconds, and the latest development version does it in 12.19. This was done on Windows. There's a little bit of apples versus oranges here, because the latest Phobos is larger than the 2.063 one.
562  
563  
564  
565  
(DMD 2.064 with this improvement hasn't been released yet, but of course you can try it out from github.)
566  
567  
568  
569  
570  
Conclusion
571  
572  
573  
574  
Even if you know your code well, you're likely wrong about where the performance bottlenecks are. Use a profiler. If you haven't used one on your codebase in a while, it's highly likely there's a bottleneck in there that's fixable with just a few lines of code.
575  
576  
577  
578  
References
579  
580  
581  
582  
583  
	DMD source code
584  
585  
	hash tables
586  
587  
	storage allocator
588  
589  
	Torbjörn Granlund and Peter Montgomery, Division by Invariant Integers using Multiplication
590  
591  
	std.algorithm source code
592  
593  
594  
595  
Acknowledgments
596  
597  
598  
599  
Thanks to Jason House and Andrei Alexandrescu for their helpful comments on this article.
600  
601  
	
602  
	
603  
604  
	
605  
606  
607  
608  
609  
610  
611  
612  
	
613  
614  
615  
616  
617  
618  
619  
620  
621  
622  
623  
624  
625  
 
626  
627  
		
628  
		
629  
		
630  
		
631  
	             
632  
     
633  
      
634  
    Related Reading
635  
636  
    
637  
        	News
638  
	Commentary
639  
640  
641  
        
642  
            News
643  
644  
			    	Application Intelligence For Advanced Dummies
645  
	SmartBear Supports Selenium WebDriver
646  
	JetBrains Upsource 1.0 Final Release
647  
	Restlet Completes "Complete" API Platform
648  
649  
More News»                        
650  
                        
651  
        
652  
653  
        
654  
            Commentary
655  
656  
			    	Tools To Build Payment-Enabled Mobile Apps
657  
	Java Plumbr Unlocks Threads
658  
	The Touch of a Button
659  
	Abstractions For Binary Search, Part 9: What Do We Need to Test?
660  
661  
More Commentary»                        
662  
            
663  
664  
    
665  
     
666  
      
667  
    
668  
        	Slideshow
669  
	Video
670  
671  
672  
        
673  
            Slideshow
674  
675  
			    	Jolt Awards 2015: Coding Tools
676  
	Developer Reading List
677  
	2013 Developer Salary Survey
678  
	Jolt Awards: The Best Testing Tools
679  
680  
More Slideshows»                        
681  
            
682  
        
683  
        
684  
            Video
685  
686  
			    	IBM Mobile Developer Challenge
687  
	Solve for Tomorrow
688  
	Perceptual Computing
689  
	Connected Vehicles
690  
691  
More Videos»                        
692  
            
693  
694  
    
695  
 
696  
    
697  
    
698  
        	Most Popular
699  
700  
701  
        
702  
            Most Popular
703  
704  
			    	The C++14 Standard: What You Need to Know
705  
	So You Want To Write Your Own Language?
706  
	Unit Testing with Python
707  
	MongoDB with C#: Deep Dive
708  
709  
More Popular»                        
710  
            
711  
        
712  
    
713  
  
714  
    
715  
716  
    
717  
    
718  
719  
720  
			
721  
			
722  
 			
723  
				
724  
					INFO-LINK
725  
	
726  
				
727  
			
728  
		
729  
730  
	
731  
	
732  
				
733  
			
734  
		
735  
736  
	
737  
	
738  
				
739  
			
740  
		
741  
742  
	
743  
	
744  
				
745  
			
746  
		
747  
748  
	
749  
750  
751  
752  
753  
754  
755  
				
756  
757  
				
758  
759  
				
760  
761  
				
762  
							
763  
			
764  
		
765  
766  
					 	
767  
 			
768  
769  
 		
770  
771  
 		
772  
		
773  
		
774  
		
775  
  
776  
777  
778  
779  
780  
781  
782  
783  
784  
	
785  
    	
786  
    		
787  
    	
788  
789  
    	
790  
791  
 
792  
    	
793  
      		Currently we allow the following HTML tags in comments:
794  
795  
			Single tags
796  
797  
			These tags can be used alone and don't need an ending tag. 
798  
799  
			<br> Defines a single line break 
800  
801  
 
802  
			<hr> Defines a horizontal line
803  
804  
805  
			Matching tags
806  
807  
			These require an ending tag - e.g. <i>italic text</i> 
808  
809  
			<a> Defines an anchor
810  
811  
812  
			<b> Defines bold text
813  
814  
815  
			<big> Defines big text
816  
817  
818  
819  
			<blockquote> Defines a long quotation
820  
821  
822  
			<caption> Defines a table caption
823  
824  
825  
			<cite> Defines a citation
826  
827  
828  
			<code> Defines computer code text
829  
830  
831  
			<em> Defines emphasized text
832  
833  
834  
835  
			<fieldset> Defines a border around elements in a form
836  
837  
838  
			<h1> This is heading 1
839  
840  
841  
			<h2> This is heading 2
842  
843  
844  
			<h3> This is heading 3
845  
846  
847  
			<h4> This is heading 4
848  
849  
850  
			
851  
			<h5> This is heading 5
852  
853  
854  
			<h6> This is heading 6
855  
856  
857  
			<i> Defines italic text
858  
859  
860  
			<p> Defines a paragraph
861  
862  
863  
			<pre> Defines preformatted text
864  
865  
866  
			
867  
			<q> Defines a short quotation
868  
869  
870  
			<samp> Defines sample computer code text
871  
872  
873  
			<small> Defines small text
874  
875  
876  
			<span> Defines a section in a document
877  
878  
879  
			<s> Defines strikethrough text
880  
881  
882  
			
883  
			<strike> Defines strikethrough text 
884  
885  
886  
			<strong> Defines strong text 
887  
888  
889  
			<sub> Defines subscripted text 
890  
891  
892  
			<sup> Defines superscripted text 
893  
894  
895  
			<u> Defines underlined text
896  
897  
898  
899  
    	
900  
  
901  
	
902  
903  
904  
	
905  
		  Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task.  
906  
		  However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.
907  
908  
	
909  
	
910  
911  
912  
	 
913  
		
914  
			To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.
915  
			
916  
		
917  
	 
918  
919  
  
920  
921  
922  
923  
924  
925  
926  
927  
928  
929  
930  
931  
932  
933  
934  
935  
		
936  
937  
938  
939  
940  
941  
		
942  
 
943  
		
944  
			
945  
946  
947  
948  
949  
950  
951  
952  
953  
954  
955  
		
956  
957  
		
958  
			
959  
 						
960  
		 
961  
				
962  
963  
964  
			
965  
			
966  
				
967  
	C/C++ Recent Articles
968  
969  
		Dr. Dobb's Archive
970  
	Jolt Awards 2015: Coding Tools
971  
	Building Node.js Projects in Visual Studio
972  
	Building Portable Games in C++
973  
	C# and .NET's Sudden Ubiquity
974  
	
975  
	
976  
977  
			
978  
979  
			
980  
						
981  
			
982  
				Most Popular
983  
984  
985  
986  
	Stories
987  
	Blogs
988  
989  
990  
991  
		
992  
					The C++14 Standard: What You Need to Know
993  
					
994  
	
995  
					A Simple and Efficient FFT Implementation in C++:
996  
 Part I
997  
					
998  
	
999  
					State Machine Design in C++
1000  
					
1001  
	
1002  
					Lambdas in C++11
1003  
					
1004  
	
1005  
					A Lightweight Logger for C++
1006  
					
1007  
	
1008  
					
1009  
					
1010  
	
1011  
					
1012  
					
1013  
1014  
1015  
1016  
1017  
1018  
		
1019  
					C++11: unique_ptr
1020  
					
1021  
	
1022  
					C++11's async Template
1023  
					
1024  
	
1025  
					Abstractions For Binary Search, Part 10: Putting It All Together
1026  
					
1027  
	
1028  
					It's Hard To Compare Floating-Point Numbers
1029  
					
1030  
	
1031  
					Auto Types and Range-Based For Statements in C++11
1032  
					
1033  
	
1034  
					
1035  
					
1036  
	
1037  
					
1038  
					
1039  
1040  
1041  
1042  
			
1043  
1044  
			
1045  
			
1046  
							
1047  
1048  
			
1049  
			
1050  
				
1051  
1052  
	This month's Dr. Dobb's Journal
1053  
1054  
	
1055  
		
1056  
			
1057  
				
1058  
					
1059  
				
1060  
			
1061  
1062  
			
1063  
				This month, 
1064  
Dr. Dobb's Journal is devoted to mobile programming. We introduce you to Apple's new Swift programming language, discuss the perils of being the third-most-popular mobile platform, revisit SQLite on Android		
1065  
				, and much more!
1066  
1067  
1068  
				Download the latest issue today. >> 
1069  
			
1070  
1071  
		
1072  
	
1073  
	
1074  
				 
1075  
			
1076  
1077  
			
1078  
			
1079  
			
1080  
			
1081  
		
1082  
1083  
		
1084  
			
1085  
1086  
1087  
1088  
   
1089  
1090  
1091  
    Upcoming Events
1092  
1093  
    
1094  
    
1095  
    
1096  
       
1097  
         Live Events
1098  
         WebCasts
1099  
                 
1100  
       
1101  
1102  
              
1103  
       
1104  
           		 
1105  
     	  	Interop ITX: The Independent Conference For Tech Leaders (April 30 - May 4 In Las Vegas) - InteropITX 2018
1106  
	                 
1107  
	Enterprise Connect Conference and Expo: March 12-15 - Enterprise Connect Orlando
1108  
	                 
1109  
	Speech Technologies - New Track at Enterprise Connect! - Enterprise Connect Orlando
1110  
	                 
1111  
	Transform Business Processes with API-enabled Integrations - Enterprise Connect Orlando
1112  
	                 
1113  
1114  
1115  
  
1116  
 
1117  
   
1118  
			
1119  
       
1120  
1121  
      
1122  
                        
1123  
         		 
1124  
      
1125  
                        		Agile Desktop Infrastructures: You CAN Have It All                        	
1126  
                            
1127  
	Mobile Content Management: What You Really Need to Know                        	
1128  
                            
1129  
	New Technologies to Optimize Mobile Financial Services                        	
1130  
                            
1131  
	How to Stop Web Application Attacks                        	
1132  
                            
1133  
	Developing a User-Centric Secure Mobile Strategy: It's in Reach                        	
1134  
                            
1135  
1136  
1137  
	   
1138  
		   
1139  
1140  
           		 More Webcasts>>
1141  
1142  
     	   
1143  
        
1144  
		       
1145  
       
1146  
       
1147  
                
1148  
    
1149  
    
1150  
1151  
1152  
1153  
1154  
1155  
1156  
1157  
1158  
1159  
	Featured Reports
1160  
1161  
	 
1162  
			 
1163  
1164  
			What's this?
1165  
1166  
		
1167  
1168  
	
1169  
				 
1170  
       
1171  
			
1172  
					
1173  
				Return of the Silos				
1174  
								
1175  
			
1176  
					
1177  
				Strategy: The Hybrid Enterprise Data Center				
1178  
								
1179  
			
1180  
					
1181  
				State of Cloud 2011: Time for Process Maturation				
1182  
								
1183  
			
1184  
					
1185  
				SaaS and E-Discovery: Navigating Complex Waters				
1186  
								
1187  
			
1188  
					
1189  
				Research: Federal Government Cloud Computing Survey				
1190  
								
1191  
1192  
1193  
		More >>
1194  
1195  
		
1196  
	
1197  
	
1198  
1199  
1200  
1201  
1202  
1203  
1204  
	Featured Whitepapers
1205  
1206  
	 
1207  
			 
1208  
1209  
			What's this?
1210  
1211  
		
1212  
1213  
	
1214  
				 
1215  
       
1216  
			
1217  
					
1218  
				Driving Your Cloud Strategy with Private Network Solutions				
1219  
								
1220  
			
1221  
					
1222  
				Managing Access to SaaS Applications				
1223  
								
1224  
			
1225  
					
1226  
				The People Problem: Cyber Threats Aren't Just a Technology Challenge				
1227  
								
1228  
			
1229  
					
1230  
				Simplify IT With Cloud-Based Wireless Management				
1231  
								
1232  
			
1233  
					
1234  
				State of Private Cloud Report: Lessons from Early Adopters				
1235  
								
1236  
1237  
1238  
		More >>
1239  
1240  
		
1241  
	
1242  
	
1243  
1244  
1245  
1246  
1247  
1248  
1249  
1250  
 
1251  
			
1252  
				Most Recent Premium Content
1253  
1254  
1255  
	Digital Issues
1256  
1257  
	
1258  
1259  
1260  
2014
1261  
1262  
Dr. Dobb's Journal
1263  
	November - Mobile Development
1264  
	August - Web Development
1265  
	May - Testing
1266  
	February - Languages
1267  
1268  
1269  
1270  
1271  
Dr. Dobb's Tech Digest
1272  
1273  
	DevOps
1274  
	Open Source
1275  
	Windows and .NET programming
1276  
	The Design of Messaging Middleware and 10 Tips from Tech Writers
1277  
	Parallel Array Operations in Java 8 and Android on x86: Java Native Interface and the Android Native Development Kit
1278  
1279  
1280  
1281  
1282  
2013
1283  
	January - Mobile Development
1284  
	February - Parallel Programming
1285  
	March - Windows Programming
1286  
	April - Programming Languages
1287  
	May - Web Development
1288  
	June - Database Development
1289  
	July - Testing
1290  
	August - Debugging and Defect Management
1291  
	September - Version Control
1292  
	October - DevOps
1293  
	November- Really Big Data
1294  
	December - Design
1295  
1296  
1297  
1298  
1299  
2012
1300  
	January - C & C++
1301  
	February - Parallel Programming
1302  
	March - Microsoft Technologies
1303  
	April - Mobile Development
1304  
	May - Database Programming
1305  
	June - Web Development
1306  
	July - Security
1307  
	August - ALM & Development Tools
1308  
	September - Cloud & Web Development
1309  
	October - JVM Languages
1310  
	November - Testing
1311  
	December - DevOps
1312  
1313  
1314  
	
1315  
	
1316  
2011
1317  
1318  
1319  
			
1320  
			
1321  
1322  
		
1323  
1324  
		
1325  
		
1326  
		
1327  
			
1328  
1329  
1330  
1331  
1332  
1333  
1334  
1335  
  
1336  
    
1337  
    
1338  
    
1339  
    
1340  
    
1341  
1342  
    
1343  
    
1344  
      
1345  
        	TECHNOLOGY GROUP
1346  
	Black Hat
1347  
	Content Marketing Institute
1348  
	Content Marketing World
1349  
	Dark Reading
1350  
1351  
1352  
        	Enterprise Connect
1353  
	GDC
1354  
	Gamasutra
1355  
	HDI
1356  
1357  
1358  
        	ICMI
1359  
	InformationWeek
1360  
	INsecurity
1361  
	Interop ITX
1362  
1363  
1364  
        	Network Computing
1365  
	No Jitter
1366  
	Service Management World
1367  
	VRDC
1368  
1369  
1370  
      
1371  
1372  
      
1373  
        	COMMUNITIES SERVED
1374  
	Content Marketing
1375  
	Enterprise IT
1376  
	Enterprise Communications
1377  
	Game Developers
1378  
	Information Security
1379  
	IT Services & Support
1380  
1381  
1382  
      
1383  
1384  
      
1385  
        	WORKING WITH US
1386  
	Advertising Contacts
1387  
	Event Calendar
1388  
	Tech Marketing
1389  
	Solutions
1390  
	Contact Us
1391  
	Licensing
1392  
1393  
1394  
      
1395  
1396  
    
1397  
1398  
  
1399  
1400  
    
1401  
1402  
  
1403  
    	Terms of Service
1404  
	Privacy Statement
1405  
	Legal Entities
1406  
	Copyright © 2018 UBM, All rights reserved
1407  
1408  
1409  
  
1410  
1411  
  
1412  
1413  
1414  
1415  
1416  
1417  
1418  
1419  
1420  
1421  
1422  
      
1423  
	
1424  
	  
1425  
      	Dr. Dobb's Home
1426  
	Articles
1427  
	News
1428  
	Blogs
1429  
	Source Code
1430  
	Dobb's TV
1431  
	Webinars & Events
1432  
1433  
1434  
	  
1435  
	
1436  
1437  
	  
1438  
	
1439  
	  
1440  
      	About Us
1441  
	Contact Us
1442  
	Site Map
1443  
	Editorial Calendar

download  show line numbers   

Snippet is not live.

Travelled to 12 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #3000518
Snippet name: Smart Bot's answer to: !fresh tikaText("http://www.drdobbs.com/cpp/increasing-compiler-speed-by-over-75/240158941")
Eternal ID of this version: #3000518/1
Text MD5: d799d7d1c59b1bb56308df93ed788772
Author: someone
Category:
Type: New Tinybrain snippet
Gummipassword: smart-bot-for-user
Uploaded from IP: 185.183.156.46
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2018-01-14 11:05:42
Source code size: 19965 bytes / 1443 lines
Pitched / IR pitched: No / No
Views / Downloads: 404 / 118
Referenced in: [show references]