good_evening
good_evening

Reputation: 21749

Why the first time C program runs, it runs 10x slower

My C program which uses sorting runs 10x slower the first time than other times. It uses file of integers to sort and even if I change the numbers, program still runs faster. When I restart the PC, the very first time program runs 10x slower. I use time to count the time.

Upvotes: 4

Views: 5892

Answers (7)

Rohan
Rohan

Reputation: 547

I had a very similar issue but I wasn't loading in a large file - so I was baffled at the long first execution time (caching couldn't have been the issue).

This answer pointed me in the right direction - it was my real-time anti-virus protection. Every time I recompiled the program it would re-scan it as being potentially malicious. I added my project path as an "Exception" to Avira's (in my case) real-time virus protection.

Program execution on the first execution is now lightening quick!

Upvotes: 1

Arvind
Arvind

Reputation: 478

There are two components to the time measured

If you are reading a file from disk,and loading it in memory - and sorting :

1)Time to read the file & store it in an array 2)Time of sorting

Were these measured separately?

Can you check this out? Invalidating Linux Buffer Cache

Instead of doing a restart, if repeating the experiment with clearing the cache gives the same result, then you can infer that File buffer caching effects were not factored into.

Upvotes: 0

nightrider
nightrider

Reputation: 95

This is because of compiler optimatization ,what it does is it caches the result for Temoparal Locality and the activation record is saved,time is also saved because the binding object donot have to be reloaded again during Linking Stage

Upvotes: 0

kmkaplan
kmkaplan

Reputation: 18960

If your program does network access then that could be the reason for the initial delay. Many network protocols need time to setup things. Some examples:

  • DNS: if your program does any network access, chances are it needs to resolve a hostname to an IP address. The first time it would need at least a network round trip to populate a local cache. Following requests would be shorter.
  • Networked filesystems (NFS, CIFS and others): opening files can happen through the network.
  • Even some seemingly innocuous library functions can require network access: the users list for the host can be on a remote directory server.

Appart from this you could use some low level tracing tool to see where the time is spent. On linux a basic tool is strace -r. There is probably some similar tool for other systems. Your compiler must also come with a profiler (i.e. gprof for GCC or maybe Valgrind).

Upvotes: 1

AurA
AurA

Reputation: 12363

This is nothing new, not just your program many popular commercial softwares face this problem.

To start with check this MATLAB Article about slow fist time execution

In case of other programming language which runs on a Virtual Machine like C# or Java this is quite common. http://en.wikipedia.org/wiki/Just-in-time_compilation#Startup_delay_and_optimizations

Caching is a good reason for that to happen in C but still 10x is quite a long duration..It might be also possible that you system was loading other resources after you restart.

You should run the program after say 10 minutes after restart for better results. All the startup application would be loaded by that time. (10 minutes ---- depends on the number of startup applications and the time it takes to start each of them)

Upvotes: 0

Erwan Queffélec
Erwan Queffélec

Reputation: 726

You have to make hypothesis and confront them to reality. The first you can reasonably make is that it does smell a lot like a caching issue !

Ask yourself those questions :

  • Does my data fits in free RAM (= is my file cached by the OS FS cache ?)
  • Does my data fits in CPU data cache ?
  • Does my data fits in HDD internal cache ?

    1. The most easy hypothesis to discard is the FS cache. Under linux, just issue sync; echo 3 > /proc/sys/vm/drop_caches between each call to your program. The first will make sure the cached data will make it to the physical medium (hard drive), the second will drop the content of the filesystem cache from memory.

    2. The 'physical medium' might be the HDD cache itself, so beware... Under linux you can disable this "write-back" cache with the command hdparm -W 0 <device>, for instance if you are working with drive sda, hdparm -W 0 /dev/sda will do the job. You might want to re-enable it after you are finished with your tests :)

    3. Another hypothesis is the CPU cache, have a look at How can I do a CPU cache flush in x86 Windows? and How to clear CPU L1 and L2 cache

Well, it may or may not be one of those, but it doesn't hurt trying :)

Upvotes: 3

Nikos C.
Nikos C.

Reputation: 51840

The operating system holds the data in RAM even if it's not needed anymore (this is called "caching"), so when the program runs again, it gets all data from there and there's no disk I/O. Even when you change the data, that change happens in RAM first, and it stays there even after its written to the file.

It doesn't stay in RAM forever though, mind you. If the memory is needed for something else, the cache is deleted. At that point, a disk access is needed (and it's cached in RAM again at that point.)

This is why first access after a reboot is always slow; the data hasn't been cached yet since it was never read from the file.

Upvotes: 17

Related Questions