{"id":6253,"date":"2021-11-23T21:22:03","date_gmt":"2021-11-23T21:22:03","guid":{"rendered":"https:\/\/www.modernescpp.com\/index.php\/an-der-winners-for-the-seven-vouchers-for-fedor-s-book-the-art-of-writing-efficient-programs-are\/"},"modified":"2021-11-23T21:22:03","modified_gmt":"2021-11-23T21:22:03","slug":"an-der-winners-for-the-seven-vouchers-for-fedor-s-book-the-art-of-writing-efficient-programs-are","status":"publish","type":"post","link":"https:\/\/www.modernescpp.com\/index.php\/an-der-winners-for-the-seven-vouchers-for-fedor-s-book-the-art-of-writing-efficient-programs-are\/","title":{"rendered":"And the Winners for the Seven Vouchers for Fedor&#8217;s Book &#8220;The Art of Writing Efficient Programs&#8221; are"},"content":{"rendered":"<p>I&#8217;m happy to present the seven winners in this post including their answers.<\/p>\n<p><!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-6246\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2021\/11\/big.jpg\" alt=\"big\" width=\"400\" height=\"494\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2021\/11\/big.jpg 400w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2021\/11\/big-243x300.jpg 243w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Strange_Packt_Behavior\"><\/span>Strange Packt Behavior<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>First, I have to apologize.<a href=\"https:\/\/www.packtpub.com\/\">Packt<\/a> said they give me two vouchers for a printed and five vouchers for a digital book. During the quiz, they decided, to skip the two coupons for the printed book and said to me that I should rewrite my posts and remove the coupons for the printed books. This was not an option for me. Therefore, I changed a little the rewards and have seven coupons.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"The_Changed_Reward\"><\/span>The Changed Reward<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>The five best answers get a coupon for a digital book. I will send your e-mail adresses to Packt. They will contact you and send you the coupon. If there is an issue, please let me know.<\/li>\n<li>Two participants get a coupon for one of my books. I will send you an e-mail and you have to answer me, which of my LeanPub books you prefer: <a href=\"https:\/\/leanpub.com\/bookstore?type=all&amp;search=Grimm\">https:\/\/leanpub.com\/bookstore?type=all&amp;search=Grimm<\/a><\/li>\n<li>I got so many good answers and I decided, therefore, the following. Each participant gets a coupon for my online course &#8220;<a href=\"https:\/\/www.educative.io\/courses\/cpp-fundamentals-for-professionals\">C++ Fundamentals for Professionals<\/a>&#8220;. I will send you an e-mail including the coupon.<\/li>\n<\/ul>\n<p>And here are the questions and the best answers. I only mention your first name.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"What_is_your_favorite_tool_to_measure_the_performance_of_your_program_and_why\"><\/span>What is your favorite tool to measure the performance of your program, and why?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"Charles\"><\/span>Charles<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div dir=\"auto\">Big fan of VTune at work, mostly because nothing else seems to work quite as well on our toolchain. I generally use the hotspot detection the most to drill into the functions that are taking up the most CPU time.&nbsp;<\/div>\n<div dir=\"auto\">&nbsp;<\/div>\n<div dir=\"auto\">Close second would be Tracy (<a href=\"https:\/\/github.com\/wolfpld\/tracy\">https:\/\/github.com\/wolfpld\/tracy<\/a>). I work in graphics and most of my timings are on a frame basis, so being able to mark parts of functions and see them in evaluation order is very important. Tracy is great because if you have the source you can add it to anything, and you can instrument only what\u2019s needed through scoping.&nbsp;<\/div>\n<h3><span class=\"ez-toc-section\" id=\"David\"><\/span>David<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>First,&nbsp; I use perf tools from Linux kernel tooling, because no compilation flags to set, just `perf record` and a pid, then `perf report` to see whatever happens.<br \/> There is almost no performance penalty to use it so so you can run almost everything without impacting the program behavior.<\/p>\n<p> Second, valgrind with callgrind, because with kcachegrind it displays things well so you can understand your program in a global way. But valgrind is highly performance impacting for program, so I use it sparsely now, and prefer perf.<\/p>\n<p>In case of multi-threaded program, I like to have, under Linux, a simple htop command running while my program is running so I can see which thread use most of a CPU (using named thread help a lot),<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Sal\"><\/span>Sal<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\"><b>My first favorite tool is<\/b> <b>Compiler Explore<\/b>r, which allows me to the code generated . See if i can improve my code logic or use better practices such using constexpr when makes sense, using std::move or universal references to avoid copying for heavy containers \/ classes. I also try to write to have better cache allocation and try to use less branching.<\/span><\/div>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\"><\/span><\/div>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\"><b>My second favorite tool is vcperf&nbsp;from MSVC<\/b> which is an open source&nbsp;performance analyzer&nbsp;and&nbsp;<\/span> C++ Build Insights is a visual explorer to be able analyze the data (<a href=\"https:\/\/github.com\/microsoft\/vcperf\">https:\/\/github.com\/microsoft\/vcperf).<\/a><\/div>\n<div>&nbsp;<\/div>\n<div><span style=\"color: #24292f; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;\">That way i can figure out the bottlenecks and work on those parts only to improve. A similar tool is available for linux i believe has perf functionality and flamegraph which is an open source visual performance analyzer uses perf: <\/span><a href=\"https:\/\/github.com\/brendangregg\/FlameGraph\">(<\/a><a href=\"https:\/\/github.com\/brendangregg\/FlameGraph\">https:\/\/github.com\/brendangregg\/FlameGraph)<\/a><span style=\"color: #24292f; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;\"><br \/><\/span><\/div>\n<div><span style=\"color: #24292f; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;\"><\/span><\/div>\n<div><span style=\"color: #24292f; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;\"><b>My third tool; is just writing scoped timers<\/b> so i can manually test certain parts quickly; especially helps when testing allocator or concurrency issues.<\/span><\/div>\n<h3><span class=\"ez-toc-section\" id=\"John\"><\/span>John<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div><span style=\"font-family: georgia, serif;\"><span class=\"gmail_default\">I think my answer will be different to others you are receiving.&nbsp; Although I&#8217;ve been involved in writing software having an explicit goal of &#8220;performance&#8221; since the 1980&#8217;s, I rarely use any kind of external tooling like a profiler.<\/span><\/span><\/div>\n<div>&nbsp;<\/div>\n<div><span class=\"gmail_default\">My current work has the explicit requirements of using little memory and running fast, as it&#8217;s a job that had to date been running on mainframe hardware, and now it&#8217;s <i>possible<\/i>&nbsp;to get it to fit on a common Linux server.&nbsp; The earliest proof of concept code wasn&#8217;t just to get the right output, but to provide metrics to clarify how much memory the scaled-up job will need, and how long it would take to run.<\/span><\/div>\n<div>&nbsp;<\/div>\n<div><span class=\"gmail_default\">That is, <b>my &#8220;tool&#8221; is to include performance metrics as part of the code<\/b>.&nbsp;&nbsp;<\/span>These can be reported via logging or telemetry in order to make sure that it continues to perform well.<\/div>\n<div>&nbsp;<\/div>\n<div><span class=\"gmail_default\">This will certainly involve noting the size and count of important objects, which is more telling than just knowing the process&#8217;s overall memory usage.&nbsp; I use a simple base class template to instrument the classes with a labeled counter and include it in the logging.&nbsp; Besides the initial assessment of how the program&#8217;s memory usage will scale with the load, <\/span><span class=\"gmail_default\">monitoring this will make sure that changes don&#8217;t increase the size of the object.&nbsp; For example, adding a <\/span><span class=\"gmail_default\"><span style=\"font-family: arial, sans-serif;\">bool<\/span><\/span><span class=\"gmail_default\"> field to an object surprises a maintenance&nbsp;coder by increasing the size of each instance by 16 bytes.&nbsp; Packing fields efficiently, using smaller types and bit-fields, we can see the result and know that the packing worked as intended.<\/span><\/div>\n<div>\n<div><span style=\"font-family: georgia, serif;\"><\/span><\/div>\n<p><span style=\"font-family: georgia, serif;\"><span class=\"gmail_default\">Of course, the running time is important to know.&nbsp; Not just the overall process time, but instrumenting the time spent in each component.&nbsp; On the platform I&#8217;m currently working on (CentOS 7 via AWS) there are two different library calls available: one to get wall-clock time with higher resolution and no syscall overhead, and one to get the separate user\/system times but at lower resolution and with the overhead of calling into the kernel.<\/span><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\"><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\"><span class=\"gmail_default\">I have a simple class I can use, with a scope wrapper to start and stop a specific timer around a section of code.&nbsp; It also reports the number of times it was started, which can be useful sometimes on its own, but is generally used to subtract out the function overhead with that multiplier.&nbsp; I look at the system time for code that does I\/O or other system calls, and use the lower-overhead, higher precision call more generally.<\/span><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\"><span class=\"gmail_default\"><\/span><\/span><\/div>\n<div><span class=\"gmail_default\">By arranging these in a logical way around the architecture of the code, it&#8217;s easy to see which parts are taking a lot of time.&nbsp; By recording the numbers and running with jobs of different sizes, we can see the algorithmic&nbsp;complexity: does the time vary directly with <\/span><span class=\"gmail_default\"><span style=\"font-family: arial, sans-serif;\">n<\/span><\/span><span class=\"gmail_default\">, or with <\/span><span class=\"gmail_default\"><span style=\"font-family: arial, sans-serif;\">n<\/span><\/span>\u00b2<span class=\"gmail_default\">?&nbsp; For stand-alone unit testing and running using mocks, we can separate out the time of<i> this component<\/i> from the time consumed by the input parsing, output formatting, and the mocks.&nbsp; When a change is made, we can see if the numbers changed drastically: either an innocent edit made the time worse for some reason, or whether something that was supposed to implement a performance improvement (at the expense of readability or maintainability) actually had an effect that was worth it.<\/span><\/div>\n<div><span class=\"gmail_default\"><\/span><\/div>\n<div><span class=\"gmail_default\">If some innocent change makes the timing seriously worse, we don&#8217;t need fancy tools to figure out that the performance issue is in <i>that code<\/i> which was just committed.&nbsp; It may be a hidden O(<\/span><span class=\"gmail_default\"><span style=\"font-family: arial, sans-serif;\">n<\/span><\/span>\u00b2)<span class=\"gmail_default\">-inducing loop, or bad branch prediction, or a coder who hadn&#8217;t yet learned that a linked list isn&#8217;t what they learned in school, performance wise.&nbsp; We don&#8217;t have to use elaborate means to hunt for it, and we catch it immediately.<\/span><\/div>\n<div><span class=\"gmail_default\"><\/span><\/div>\n<div><span class=\"gmail_default\">The point is to keep a handle on these performance-related metrics, we don&#8217;t have to make a special run using a special tool.&nbsp; They are built in, automatically reported when running the local unit testing.<\/span><\/div>\n<div><span class=\"gmail_default\"><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\">S<\/span><span class=\"gmail_default\">lightly more generally, the idea is to <b>build something that you can easily measure the performance of<\/b>.&nbsp; For example, a unit testing program will not read one line of input, digest it, call the actual component, and repeat; although that is how you might prefer to do it in &#8220;real&#8221; usage.&nbsp; Instead, it reads in all the input and stores it in a <\/span><span class=\"gmail_default\"><span style=\"font-family: arial, sans-serif;\">std::vector<\/span><\/span><span class=\"gmail_default\">, and closes the file.&nbsp; Then, it processes the input by iterating over the in-memory vector.&nbsp; This isolates the timing of the actual component from the system I\/O usage.&nbsp; Even the extra memory used by the intermediate storage of the entire input can be noted at the end of that stage, to be subtracted out of the process total.&nbsp; And of course it doesn&#8217;t affect the measurements of the object count, since it&#8217;s unrelated to that.<\/span><\/div>\n<div>\n<div><span style=\"font-family: georgia, serif;\"><\/span><\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Jose\"><\/span><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">Jos\u00e9 <\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">The tool I used the most to evaluate the performance of my programs is <b>valgrind<\/b><\/span><\/div>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">I find it to be the best tool to find memory leaks &#8212; simple usage is quite intuitive but it still has a bunch of extra powerful&nbsp;features.<\/span><\/div>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">I worked on robotics for many years, and our target systems had much less memory and computational speed than regular computers &#8212; this usually means that trying to run valgrind on the target systems renders them too slow to the point they become unusable, however, I was still lucky in a handful of times and valgrind caught a few issues on target without compromising robot&#8217;s behavior too much &#8212; issues that were not reproducible in debug\/simulation environment.<\/span><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Ivica\"><\/span>Ivica<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div>My favorite tool is perf to collect the profiling data, and speedscope to visualize it. Perf is really good, it is available in Linux by default, it can measure runtime, but also all other sorts of events like: cache misses, mutex contentions, mallocs, etc. You don&#8217;t need to recompile your code, everything works straight from the box.<\/div>\n<div>&nbsp;<\/div>\n<div>My favorite tool for visualization is speedscope. It takes the perf&#8217;s output and displays it in web browser. It supports flame graphs, but also can track program execution in time, or it can group functions&nbsp;by runtime. Here it how it works in practice:<\/div>\n<div>&nbsp;<\/div>\n<div><a href=\"https:\/\/www.speedscope.app\/#profileURL=https%3A%2F%2Fraw.githubusercontent.com%2Fibogosavljevic%2Fjohnysswlab%2Fmaster%2F2021-03-speedscope%2Fspeedscope-ffmpeg.txt\"><\/a><a href=\"https:\/\/www.speedscope.app\/#profileURL=https%3A%2F%2Fraw.githubusercontent.com%2Fibogosavljevic%2Fjohnysswlab%2Fmaster%2F2021-03-speedscope%2Fspeedscope-ffmpeg.txt\">https:\/\/www.speedscope.app\/#profileURL=https%3A%2F%2Fraw.githubusercontent.com%2Fibogosavljevic%2Fjohnysswlab%2Fmaster%2F2021-03-speedscope%2Fspeedscope-ffmpeg.txt<\/a><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Fares\"><\/span><span style=\"font-family: arial, sans-serif;\">Far\u00e9s<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div><span style=\"font-family: arial, sans-serif;\">These are three big names I know of ( as a Linux developer ) there&#8217;s plenty of other smaller ones that haven&#8217;t seen active development in a while.<\/span><\/div>\n<ul>\n<li><span style=\"font-family: arial, sans-serif;\">Valgrind<\/span><\/li>\n<li><span style=\"font-family: arial, sans-serif;\">TAU &#8211; Tuning and Analysis Utilities<\/span><\/li>\n<li><span style=\"font-family: arial, sans-serif;\">Google Perftools<\/span><br \/><span style=\"font-family: arial, sans-serif;\"><\/span><\/li>\n<\/ul>\n<div><span style=\"font-family: arial, sans-serif;\"><br \/>I personally use Google Perftools because it is faster than Valgrind (yet, not so fine-grained)<br \/>Does not need code instrumentation<br \/>Nice graphical output ( &#8211;&gt; Kcachegrind )&nbsp;<br \/>Does memory-profiling, CPU-profiling, leak-checking<br \/><\/span><\/div>\n<div><span style=\"font-family: arial, sans-serif;\"><\/span><\/div>\n<div><span style=\"font-family: arial, sans-serif;\">IMHO, some go for a debugger ( Maybe the best method ). All you need is an IDE or debugger that lets you halt the program. It nails your performance problems before you even get the profiler installed.<br \/><\/span><\/div>\n<div><span style=\"font-family: arial, sans-serif;\">For instance, the profiler in Visual Studio 2008 is very good: fast, user-friendly, clear, and well-integrated in the IDE.<\/span><\/div>\n<h1><span class=\"ez-toc-section\" id=\"Tell_me_how_your_favorite_tool_helped_you_find_the_performance_bottleneck\"><\/span>Tell me how your favorite tool helped you find the performance bottleneck.<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h3><span class=\"ez-toc-section\" id=\"Charles-2\"><\/span>Charles<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In almost every case the performance bottlenecks I face in C++ are never where I think they should be, even after godbolting sections of code and comparing edits. These kinds of very introspective tools allow me to find the actual problem, not the hypothetical thing I think it is, and target it very directly.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"David-2\"><\/span>David<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Not sure I used one for this, may be commented line of codes are the most usefull tools, so I can slip my code and activate or deactivate some parts so I can measure which performance improvement I have. I can do some refactoring and see how my code change by measuring it (using a simple time outside, or a timer inside the code itself)<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Sal-2\"><\/span>Sal<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">Writing a scope timer and memory tracker really helped to understand how many allocations cause using standart vector and string but using a pmr allocator or writing custom allocator really helped to avoid as much as possible<\/span><\/div>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\"><\/span><\/div>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">I am still learning those and I know performance analysis is hard since it involves CPU as well and the number of tests that you can run is limited. Therefore having CI tools and using tools such as Google Benchmark&nbsp;and Quickbench will help. I will be learning those as well.<\/span><\/div>\n<h3><span class=\"ez-toc-section\" id=\"John-2\"><\/span>John<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div><span style=\"font-family: georgia, serif;\">W<span class=\"gmail_default\">ell, in the current project, I gave typical examples above: see which architectural parts are slowest, and see if an edit had a change in the overall timing or memory usage.<\/span><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\"><span class=\"gmail_default\"><\/span><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\"><span class=\"gmail_default\">But I would say a &#8220;favorite&#8221; would be when I could almost instantly say &#8220;The problem is not in <i>my<\/i> code.&#8221;&nbsp; Maybe (just making up some numbers here) the client (internal customer using this component in a larger context) finds that a call is taking 25 seconds.&nbsp; He can only separate out the wall-clock time of the call and the overhead of the remote network call, as that&#8217;s built into the framework (see: built-in measurements are handy!)&nbsp; But I can look at the logging and say that my component only took 8 seconds, and that his problem is that he&#8217;s spending all his time formatting the output into JSON for the return over the network.<\/span><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\"><span class=\"gmail_default\"><\/span><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\"><\/span><\/div>\n<div><span style=\"font-family: georgia, serif;\">L<span class=\"gmail_default\">et me add that this technique is available and very useful even on platforms where we <i>don&#8217;t have<\/i> other tools like profilers, or a GUI running on the same system.&nbsp; This can be a locked-down restricted corporate server with nothing installed other than what came in the OS image, or an embedded system with no room for anything other than the actual code and none of the needed support for such tools to even exist.<\/span><\/span><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Jose-2\"><\/span><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">Jos\u00e9 <\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">I distinctly&nbsp;remember two instances of the tool helping me. One as a <b>direct<\/b> result of the output valgrind provides, the other as an <i>indirect<\/i>&nbsp;result.&nbsp;<\/span><\/div>\n<div><span style=\"color: #444444; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\">Well, the former was a very small leak growing unbounded from object creation and destruction; the robot would behave properly for 3-4h and then become unresponsive &#8212; we noticed RAM usage going through the roof. No issues happened in the simulation environment, however, running valgrind in the target for a few minutes was enough to catch the small leak &#8212; in a servo driver which explained why it was not happening in the simulation environment.<br \/>The latter proved to be a memory leak caused by a <i>race condition <\/i>in our interactions with external systems. When running in a simulation environment, valgrind detected leaks in distinct&nbsp;portions of the code and we were unable to pin-point where. But, in real deployment, there were no leaks being detected by valgrind which really puzzled us at first &#8211; could they be happening in the emulation layer?&nbsp; But, we also took into consideration that the system behaves much slower when valgrind is monitoring memory usage, so, maybe the leak was caused by some faster sequence of actions &#8211;&nbsp;that hint helped us find the culprit, it was in a communication protocol layer responsible to exchange data with the GUI interface.<\/span><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Ivica-2\"><\/span>Ivica<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div>Perf+speedscope help me everyday. I record what the program is executing with <i>perf record<\/i>, then I visualize it with <i>perf script | speedscope &#8211;<\/i>. This fires up the web browser and displays the profile.<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Fares-2\"><\/span><span style=\"font-family: arial, sans-serif;\">Far\u00e9s<\/span><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div><span style=\"font-family: arial, sans-serif;\">I googled the info and stumbled to this article which I need to understand:&nbsp; JFYI&nbsp; &nbsp;<\/span><a href=\"http:\/\/15418.courses.cs.cmu.edu\/spring2013\/article\/19\">http:\/\/15418.courses.cs.cmu.edu\/spring2013\/article\/19<\/a><\/div>\n<div>&nbsp;<\/div>\n<div>&nbsp;<\/div>\n<div><\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<div id=\"simple-translate\">\n<div>\n<div class=\"simple-translate-button isShow\" style=\"background-image: url('moz-extension:\/\/981aa874-2db4-44d3-a97f-b02a72476831\/icons\/512.png'); height: 22px; width: 22px; top: 15px; left: 23px;\">&nbsp;<\/div>\n<div class=\"simple-translate-panel\" style=\"width: 300px; height: 200px; top: 0px; left: 0px; font-size: 13px; background-color: #ffffff;\">\n<div class=\"simple-translate-result-wrapper\" style=\"overflow: hidden;\">\n<div class=\"simple-translate-move\" draggable=\"draggable\">&nbsp;<\/div>\n<div class=\"simple-translate-result-contents\">\n<p class=\"simple-translate-result\" dir=\"auto\" style=\"color: #000000;\">&nbsp;<\/p>\n<p class=\"simple-translate-candidate\" dir=\"auto\" style=\"color: #737373;\">&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m happy to present the seven winners in this post including their answers.<\/p>\n","protected":false},"author":21,"featured_media":6246,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[360],"tags":[],"class_list":["post-6253","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"_links":{"self":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/6253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/comments?post=6253"}],"version-history":[{"count":0,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/6253\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media\/6246"}],"wp:attachment":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media?parent=6253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/categories?post=6253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/tags?post=6253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}