There comes a time in most complex programs where you want to ask a simple question like, ‘have I already processed a string with this id’? Linear searches through an array are easy to write and work well enough for small array sizes. Plus, the memory overhead of linear searches is fantastic, since it basically has none. But when your arrays can contain many elements, it is time to ditch those linear searches and go with an ordered map or unordered map. Continue reading ‘Ordered map vs. Unordered map – A Performance Study’ »
Posts tagged ‘C++’
I was fairly young when I first learned C++. It quickly became my favorite language by such a wide margin, that for many years, I shunned all other programming languages. For me, C++ was easy, high performance, portable, and powerful. Fast forward about 15 years, and here we are today. I was tasked with writing a fairly sophisticated web automation tool for a startup company. The tool needed to be ready as soon as possible, and that is how my journey to C#. Continue reading ‘My transition from C++ to C#’ »
In memory image compression is essential for any type of visual computing application. Images alone can take a good amount of memory, and when creating an application which uses many images, you may soon find yourself using several gigabytes of memory. While this may be fine for your personal workstation, it may not be okay if you intend to release your application to the public. To work around this memory consumption problem, you’ll want to use in-memory image compression techniques to reduce your program’s memory footprint. Continue reading ‘In Memory Image Compression tutorial’ »
When performing image transformation and manipulation techniques, it is often necessary to employ some sort of interpolation or filtering in order to obtain a good image quality. For example, if you scale an image, you can determine the final color of each pixel by either some basic nearest neighbor method, or a more advanced interpolation method. However, an interpolation method will invariably offer better final image quality. In this tutorial, we’ll be writing a function to rotate an image, using bilinear interpolation. This tutorial also demonstrates how to perform a high quality image rotate transformation, however, that is not the focus of this tutorial, but rather the example transform being performed. Continue reading ‘Coding Bilinear Interpolation’ »
In a previous article about image processing with SSE, we used some basic SSE intrinsics to perform a very easy image manipulation routine, removing all blue from an image. This task was easy, since each pixel was 8 bits per component, with 4 components (ARGB). However, for more advanced image processing functions such as 2D convolution, it is preferable to work with each color component as a 32-bit floating point number rather than an 8-bit unsigned integer. Continue reading ‘Advanced Image Processing with SSE’ »
CUDA is great for any compute intensive task, and that includes image processing. In this tutorial, we’ll be going over why CUDA is ideal for image processing, and how easy it is to port normal c++ code to CUDA. Continue reading ‘Intro to image processing with CUDA’ »
This tutorial shows you how to download an HTML page, or any other type of web page, using C++ or C. This tutorial is only applicable for Windows programs, since the methods described here utilize a library written for Windows only. In this tutorial, we will be calling a function which will read a webpage, and save it to a file. After the file is created and saved, we can proceed to read that file through standard methods. At first glance, it may seem like this method is very inefficient, since hard drive accesses take a long time. But in actuality, the vast majority of the performance penalty will be from downloading the web page from the internet. Since the we read the file directly after creating it, you can be assured that the file is in cache, so there won’t be such a performance hit.
Step 1: Include and link the appropriate library
#include <urlmon.h>
Aside from including the library header file, you will need to link the urlmon.lib. To do this, right click on your project in the solution explorer windows, and select Properties from the pop-up menu. Go to the Configuration Properties -> Linker -> Input window. In the “Additional Dependencies” field, type urlmon.lib and press enter. Apply your changes, and close the project properties window.
Step 2: Choose Unicode or ASCII for your project
There are two types of character sets that can be used in an application. The first, ASCII, has only 8 bits, or 1 byte, per character. ASCII is often considered outdated, but is much simpler to deal with. Unicode uses more 16 bits per character, which facilitates muli-lingual programs. There are two sets of functions in the urlmon library, one set of functions is for ASCII, and the other set of functions is for Unicode. I have set the project in this tutorial to compile with the ASCII character set. You may choose to use Unicode, of course, but it just important that you know what character set your project is set to compile. To find out, open up the project properties window, and go to the Configuration Properties -> General window. Notice what the “Character Set” field is set to. “Not Set” corresponds to using the ASCII character set.
Step 3: Download the web page to a file
To download the web page, simply use the URLDownloadToFile function. This function returns an HRESULT error code, which is really just a long. When dealing with HRESULTs, just keep in mind that zero is returned as success. Therefore, it is always best to explicitly use the error code definitions, such as S_OK for success.
char webAddress[256]; char szFileName[80] = "result.html"; cout << "Please enter web address: "; // example: http://supercomputingblog.com cin >> webAddress; HRESULT hr = URLDownloadToFile(NULL, webAddress, szFileName,0, NULL); if (hr == S_OK) { cout << "Success!\n"; // Open the file and print it to the console window // Since the file was just written, it should still be in cache somewhere. ifstream fin(szFileName); char szBuff[2048]; while(fin.getline(szBuff, 2048)) { cout << szBuff << "\n"; } } else { cout << "Operation failed with error code: " << hr << "\n"; }
Download the source code
Understanding how to use LockBits is essential for creating high performance GDI+ applications. Usually, GDI+ is thought of as a low performance graphics API. While arguments can be made for this, if you use GDI+ properly, you can achieve great performance. Continue reading ‘Using LockBits in GDI+’ »