I will provide one solution which will be using ANSI C and LibraryLink. Needless to say that this is speeder...(Platform: MacOSX, gcc 4.2)
The preparations are the same as in Leonid's answer.
Implementation
dayofweek = "
#include \"WolframLibrary.h\"
DLLEXPORT mint WolframLibrary_getVersion(){
return WolframLibraryVersion;
}
DLLEXPORT int WolframLibrary_initialize( WolframLibraryData \
libData) {
return 0;
}
DLLEXPORT void WolframLibrary_uninitialize( WolframLibraryData \
libData) {
return;
}
#define _LEAP_YEAR(year) (((year) > 0) && !((year) % 4) && \
(((year) % 100) || !((year) % 400)))
#define _LEAP_COUNT(year) ((((year) - 1) / 4) - (((year) - 1) / \
100) + (((year) - 1) / 400))
const int yeardays[2][13] = {
{ -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 },
{ -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }
};
const int monthdays[2][13] = {
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
int weekday(int year, int month, int day)
{
int ydays, mdays, base_dow;
/* Correct out of range months by shifting them into range (in the same year) */
month = (month < 1) ? 1 : month;
month = (month > 12) ? 12 : month;
mdays = monthdays[_LEAP_YEAR(year)][month - 1];
/* Correct out of range days by shifting them into range (in the same month) */
day = (day < 1) ? 1 : day;
day = (day > mdays) ? mdays : day;
/* Find the number of days up to the requested date */
ydays = yeardays[_LEAP_YEAR(year)][month - 1] + day;
/* Find the day of the week for January 1st */
base_dow = (year * 365 + _LEAP_COUNT(year)) % 7;
return (base_dow + ydays) % 7;
}
DLLEXPORT int dayOfWeek(WolframLibraryData libData,
mint Argc, MArgument *Args, MArgument Res) {
mint I0, I1, I2;
I0 = MArgument_getInteger(Args[0]);
I1 = MArgument_getInteger(Args[1]);
I2 = MArgument_getInteger(Args[2]);
MArgument_setInteger(Res, weekday(I0, I1, I2));
return LIBRARY_NO_ERROR;
}
";
Create the Library and load it
lib = CreateLibrary[dayofweek, "dayOfWeek", CompileOptions -> "-O3 -funroll-loops"];
dow = LibraryFunctionLoad[lib, "dayOfWeek", {Integer, Integer, Integer}, Integer];
For CL (Microsoft's compiler has similar options with different naming...)
The dayOfWeek function
Clear[dayOfWeek];
dayOfWeek[dates_List] :=
dow[#[[1]], #[[2]], #[[3]]] & /@
Transpose@{#[[All, 1]], #[[All, 2]] - 1, #[[All, 3]]} &@dates
Timing
{0.067380,{6,5,6,6,3,2,0,0,4,6,4,3,5,3,4,6,6,<<99966>>,...}}
Conclusion
As the argumentation holds to use Java, because of it's simple interface I think I've shown that this holds as well for C/C++ and is unbeatable fast.