Google+

Have Your Pi and Eat it Too: A Comparison of C# and C++ Performance

In honor of National Pi Day, we thought it would be fun to calculate Pi and talk about performance differences between C# and C++. There is some math coming your way (yeah Math!), but feel free to skip to the end for a discussion on performance.

So back in the day, when things where WAY different, Pi was calculated using a mathematical series. One of the more famous ones uses the arctan math function to calculate the value of π. This is called the Leibniz formula for π and is represented by

Pictue 1

Now, this is one of the more inefficient ways to calculate π, it takes about 10 million terms to get an accuracy of 7 decimal places. For those of us asking performance differences between languages though, that is great!

We have written two programs to calculate π, one in C# and one in C++. They are both syntactically similar and use the same algorithm. We tried to get as close to an apples comparison as we could, but in comparing two different languages, we did our best, you are still comparing an apple to an orange.

So, what did we see? We calculated π to 15 decimal points, 3.141592653589793 for those of you keeping track at home. Both programs took almost 100 million iterations to converge, 99,995,330 to be exact. We ran each of the programs 10 times to get an average as shown in the following table

Run C++ C#
1 4.384 6.908
2 4.299 6.466
3 4.3375 6.805
4 4.18 6.584
5 4.523 6.516
6 4.186 6.518
7 4.164 6.492
8 4.175 6.351
9 4.274 6.56
10 4.342 6.589
Average 4.29 6.58

The calculation of π using C++ is 35% faster that it's corresponding C# code. This is to be expected. Many modern languages such as C# and Java run through a managed runtime. This brings MANY efficiencies to developers. However, the runtime tends to add overhead when it comes to performance.

The pragmatic folks reading this realize, that the benefits of a managed execution environment and modern language generally outweigh performance gains from a language like C++. There are reasons that C# and Java are used instead of C++ because developers can be more productive. Our example here, using a very slow numerical algorithm and running it for ten million iterations is a stretch for most scenarios. The 2.5 second difference for such an intensive calculation, while relatively large in our example, in the grand scheme of things is not that big of difference.

So why bring it up? It is important to think through performance more and more in today's computing environment for two reasons. The first is cost. As more and more organization move to utility based computing with hosted services, such as Amazon Web Services (AWS) and Azure, organization are paying for their compute cost. If you can realize performance gains that reduce CPU cycles that has a direct impact on the bottom line. The second reason is that mobile is taking over the world, and mobile users want more battery life, not less. Fewer CPU cycles on a smartphone or tablet will result in better battery life.

It will be very rare that most organizations would use C++ or other "closer to the metal" languages for their Line of Business (LOB) applications. The moral of the story though is for intensive processes in cloud hosted or mobile environments, you want to be razor focused on optimizing your code for performance, no matter what language you choose.

Both code examples are included, so for National Pi day, make a circle, calculate some π, eat some pie and enjoy!

C++

// LifeOfPi.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;

void pi( double *pi_value, int *iterations);  

int main ( void )  
{  

      int iterations = 0;     // number of actual loop iterations in pi 
      double pi_value = 0;    // computed value of pi 

      clock_t cBegin = (double)clock () ; 
      pi(&pi_value, &iterations);  
      printf("   %0.15f with %d iterations\n",  pi_value, iterations);  
      clock_t cEnd = (double) clock() ; 

      std::cout << float( cEnd - cBegin ) 

return 0;  

}    

void pi( double *pi_value, int *iterations)  
{  
      int i;  
      int k=1;
      double realPi = 3.141592653589793; 
      double epsilon = 0.00000001;
      double delta=10;
      *pi_value= 0;
      while (delta>epsilon) {
            *pi_value += pow(-1,(k+1))/(2*k-1);
            delta = fabs((4* *pi_value)-realPi);
            k++;
      }
      *iterations = k;
      *pi_value = 4 * *pi_value;

      return; // indicate program ended sucessfully 

} // end fucntion main

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LifeOfPiCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            int iterations = 0;
            double pi_value = 0;

            DateTime startTime = DateTime.Now;
            pi(out pi_value,out iterations);
            DateTime endTime = DateTime.Now;
            Console.WriteLine(pi_value.ToString() + " in " + iterations);
            TimeSpan diff = endTime.Subtract(startTime);
            Console.WriteLine(diff.Seconds + "."+diff.Milliseconds);
        }

        public static void pi(out double pi_value, out int totalIterations)
        {
            double realPi = 3.141592653589793;
            double epsilon = 0.00000001;
            double delta = 10;
            int k = 1;

            pi_value = 0;
            while (delta > epsilon)
            {
                pi_value += Math.Pow(-1, (k + 1)) / (2 * k - 1);
                delta = Math.Abs((4 * pi_value) - realPi);
                k++;
            }
            totalIterations = k;
            pi_value = 4 * pi_value;

        }
    }
}

 

This blog post originally appeared at Skyline Technologies


 

Automatic Builds and Deploys to Azure Websites

Azure Websites are a great tool to explore pieces of the various technology stacks, especially in the Microsoft space. They include the ability to quickly spin up servers running blogging engines, CMS systems, etc. You can also create other services such as SQL back ends, Media services, Access control services, etc. At the end of the day though, what you are really getting is a shared server in the cloud, than can host all kinds of custom applications as long as you know how to get them there.

For developers, one of my favorite parts of Azure websites is the integration with cloud hosted source code repositories such as Github and Microsoft's cloud version of Team Foundation Server. You can setup your Azure hosted website so that any time you or members of development teams you are on check in code, it is automatically built and deployed to your site. Organizations that implement projects in this manner, with automatic builds, unit tests and deploys to test or production servers without ever touching the server are much more mature organizations with less bugs and more reliable code. If you are at an organization were you are NOT doing this, Azure websites and integration with TFS or Git can be a great tool in helping build a business case within the organization.

The good news is setting this up with Azure websites is trivial. Let's walk through the process.

For this post, we will automatically deploy a MVC project in Visual Studio hosted in the cloud version of TFS to an Azure website. The first step is to create a TFS account in the cloud if you have yet to do so. You can do this at https://tfs.visualstudio.com. The good news is for individuals and small companies or development shops, this is free. Microsoft allows for up to five users for TFS cloud hosted project. Teams that are bigger than that can also use TFS, but will have to migrate to a paid version down the road. As of this time (March 2013) pricing has yet to be announced.

Click the Sign up for free link after signing into TFS preview. You will then be asked to create a URL for your TFS project

Click create account and you are then take to the Project screen. From here you can either create a Team Project or a Team Project with Git support.

We will create a New Team Project

A few seconds later, a Team Project is created.

You can now connect to this TFS site from Visual Studio. To do that, go to the Team menu and select Connect to Team Foundation server

Click the Add button and type in the URL that you just created, in our example, CodeMoneky.VisualStudio.com (I realize typo, the original URL was taken...)

You will be prompted to sign in with your Microsoft account. You can then create your project and check it an as you as you normally would. Add the solution to source control

And check in your code

Now you have gone through the process of adding your code to TFS. The next step is to get the automatic build and deploy working. That is the easy part!

Log into the Azure Management console and create a new Azure website by clicking the new button in the bottom right

Choose custom create from the options

Create a URL for your site and make sure Publish from source control is checked. By default it is not

Click the source code repository of your choice, our example will be TFS.

Independent of the back end (TFS, Git), we will authorize the account. For TFS, click the Authorize Now link

It will then show a list of projects hosted in TFS, we just choose the project to deploy.

It then creates the project. We wait a few minutes, if we have not waited long enough we see a screen like this

And after we are done, the default MVC template project.

The best part, now whenever solution changes are checked in by you, or project team members, they are automatically deployed from TFS to your Azure website. This functionality is the same for other source code repositories.

As you can see, Azure websites integration with source control systems like Git and TFS make the automation of your build process sleek and simple. It is a great opportunities for small companies and startups to have best practices in place as well as the ability to quickly see code changes and updates. Check it out!


 

Being John Ptacek – Configuring Wordpress for Authorship Markup

Update - June 2, 2014 Google has been deprecating a lot of the SEO benefits laid out in this post

A while back, Scott Hanselman had a blog post about embracing authorship. Essentially, it was a discussion about using Google's authorship markup on your website to help identify content you wrote. Like a lot of my recent posts, I decided to give this a run on my blog, which is an Azure hosted site running Wordpress.

At a high level, implementing this is a two-step process. First, Google needs to have a trusted "identity card". A place where the author identity is managed. As you can imagine, for Google this is Google+. You need to use your identity card (Google+) and say that you write content for a given site (in this example, jptacek.com). The next step is when you write content, you need to link back to your Google+ profile.

First why, would someone do this? There are quite a few reasons

1 - Manage "brand". Whether it is your personal brand or your corporate brand, it helps build online presence

2 - Search Engine Optimization. Google keeps the magic sauce of its page ranking very close to the vest. However, former Google CEO Eric Schmidt has explicitly stated in the future, content linked to online profiles will be ranked higher.

3 - Search Results will be more eye catching. Google will put your author photo into links for pages you have created.

For more on this, Forbes recently published an article about why business should be using Google author tags.

So what are the steps to do this for your site? There are several sites that explain this. Google has a nice introduction as well as the Scott Hanselman post.

The first step is to identify to Google that you contribute to a site. This is done by going to your Google+ profile at http://profiles.google.com/me and clicking Edit Profile.

Click Add a custom link and link to your blog. I blog a lot for at Skyline Technologies, where I work, so I included a contributor link there. I also blog on my personal site. You will notice that each link has multiple links. This is a result of adding the link manually for each site as well as doing a corresponding email verification. So we have finished part one, letting Google know where we are creating content.

The next step is to update Wordpress to have posts link back my author profile with the author tag. For my profile, the url is https://plus.google.com/117170075977212738060?rel=author. You will want to change the really long number to be your profile ID.

I did this in several ways. First, on the main site I have a list of links for things like Twitter and LinkedIn. I included a link to Google+ here also

Next, I update footer.php template for Wordpress to have a link back to the Google Profile. This will ensure each page on the site is identified. Last, the header.php section was updated with a Meta tag

rel="author" href="https://plus.google.com/117170075977212738060?rel=me" />

Last, is to add a link to the content.php identifying the author of the article that links back to your Google Profile

By John Ptacek

Okay, we have setup a bunch of links. How do we know if it works? Google has a Structured Data Testing tool that will tell you. If you go to http://www.google.com/webmasters/tools/richsnippets you can check your blog and see if Google recognizes the markup.

You also notice that there is an email verification. This is another way to ensure your links are set. This is the reason two links appear for each site I was a contributor to in my Google Plus profile. I added each URL manually, and then as another level of verification, I verified an email address for each site.

What is the end result? When I search Google for content, my picture is now appearing in the search results

Posts I have a written now appear with a picture next to my name. You can also see that there are several hyperlinks in the search results.

The first, the byline (by John Ptacek) links to my Google+ profile.

The second, More by John Ptacek,

displays articles I have written as well as author information as you can see here

As you can see, it is relatively easy to start identifying content you have created and having increased visibility in page results.

As organizations embrace thought leadership, this is a great tool to ensure your employees and their content continues to be discoverable!


 

John Ptacek I'm John Ptacek, a software developer for Skyline Technologies. This blog is my contains my content and opinionss, which are not those of my employer.

Currently, I am reading Norse Mythology by Neil Gaiman

@jptacekGitHubLinkedInStack OverflowGoogle+