- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
static char months [] = "JanFebMarAprMayJunJulAugSepOctNovDecGlk";
static char dows [] = "SunMonTueWedThuFriSatEar";
int dd [] =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void gen_http_date (char date_buffer[29], int time) {
int day, mon, year, hour, min, sec, xd, i, dow;
if (time < 0) time = 0;
sec = time % 60;
time /= 60;
min = time % 60;
time /= 60;
hour = time % 24;
time /= 24;
dow = (time + 4) % 7;
xd = time % (365 * 3 + 366);
time /= (365 * 3 + 366);
year = time * 4 + 1970;
if (xd >= 365) {
year++;
xd -= 365;
if (xd >= 365) {
year++;
xd -= 365;
if (xd >= 366) {
year++;
xd -= 366;
}
}
}
if (year & 3) {
dd[1] = 28;
} else {
dd[1] = 29;
}
for (i = 0; i < 12; i++) {
if (xd < dd[i]) {
break;
}
xd -= dd[i];
}
day = xd + 1;
mon = i;
assert (day >= 1 && day <= 31 && mon >=0 && mon <= 11 &&
year >= 1970 && year <= 2039);
sprintf (date_buffer, "%.3s, %.2d %.3s %d %.2d:%.2d:%.2d GM",
dows + dow * 3, day, months + mon * 3, year,
hour, min, sec);
date_buffer[28] = 'T';
}
Делать имена месяцев и дни недели одной сишной строкой, чтобы потом выводить оттуда по три символа через sprintf, считая оффсет умножением на 3 т.к. имена месяцев и дней недели влазят в три символа
https://github.com/vk-com/kphp-kdb/blob/ce1ac4fbde2d3b546936ad07d6a748958f6d2198/net/net-http-server.c#L664
http://roem.ru/2013/07/20/kphp76561/
>ВКонтактовские "олимпиадники"-чемпионы ACM разработали крайне интересную высоконагруженным сайтам технологию.
Хреновые какие-то олимпиадники попались, раз неосилили http://ideone.com/IfvBgi
minusator41 09.03.2014 21:27 # −10
nixel 09.03.2014 22:12 # 0
assert (day >= 1 && day <= 31 && mon >=0 && mon <= 11 &&
year >= 1970 && year <= 2039);
Про 1970 очевидно, начало юникс-времени и вселенной. А что у нас с 2039 годом?
falsting 09.03.2014 22:17 # +3
> Самая поздняя дата, которая может быть представлена таким форматом в стандарте POSIX — это 03:14:07, вторник, 19 января 2038 года по Всемирному времени (UTC).
https://ru.wikipedia.org/wiki/Проблема_2038_года
Проверка, впрочем, в таком случае становится хоть и логичной, но некорректной.
nixel 09.03.2014 22:26 # 0
Спасибо.
Xom94ok 09.03.2014 22:25 # +4
j123123 09.03.2014 22:37 # +6
http://ideone.com/GAJ1j1
Xom94ok 09.03.2014 22:57 # 0
Пойду стандарт полистаю
tirinox 10.03.2014 09:09 # +4
Xom94ok 10.03.2014 16:37 # +1
bormand 11.03.2014 09:34 # +5
Именно поэтому все размерности, кроме самой первой, должны быть константами...
Lure Of Chaos 13.03.2014 00:50 # 0
falsting 09.03.2014 22:33 # +1
https://github.com/vk-com/kphp-kdb/blob/ce1ac4fbde2d3b546936ad07d6a748958f6d2198/net/net-http-server.c#L735
roman-kashitsyn 09.03.2014 23:03 # +5
Abbath 09.03.2014 23:06 # +7
TarasB 09.03.2014 23:29 # +7
dd[1] = 28;
} else {
dd[1] = 29;
}
а что, 2100 - високосный?
а, ну да, он же не в диапазоне, значит можно хуй забить
АЦМ-логика, да
3.14159265 10.03.2014 01:58 # +1
И байтоёбства преступно мало.
Может тут можно было ускорить поиск:
bormand 10.03.2014 07:19 # +6
bormand 10.03.2014 08:45 # +2
bormand 10.03.2014 08:54 # +5
Soul_re@ver 10.03.2014 09:02 # −2
Тогда нужно ещё и силу трения отменить вдобавок и всю термодинамику.
bormand 10.03.2014 09:03 # +2
Abbath 10.03.2014 11:38 # +1
bormand 10.03.2014 11:44 # +1
Abbath 10.03.2014 11:46 # 0
bormand 10.03.2014 12:00 # +3
Тут же именно само соотношение между периодом обращения вокруг солнца и вокруг своей оси забагованное.
Abbath 10.03.2014 12:02 # +3
bormand 10.03.2014 12:03 # +2
Abbath 10.03.2014 12:42 # +2
bormand 10.03.2014 12:48 # +2
Abbath 10.03.2014 12:51 # +3
Abbath 10.03.2014 12:46 # +3
bormand 10.03.2014 12:49 # +2
(Вики гласит, что полная энергия взрыва царь-бомбы оценивается в 2,4·10^17Дж).
Abbath 10.03.2014 12:57 # +5
http://lib.rus.ec/i/23/299223/p47.png
А так у нас всего 14 разных календарей.
Stertor 10.03.2014 13:19 # −2
Abbath 10.03.2014 13:23 # +2
bormand 10.03.2014 13:42 # +2
Stertor 10.03.2014 13:49 # −3
bormand 10.03.2014 13:57 # +1
Stertor 10.03.2014 14:11 # −2
Soul_re@ver 10.03.2014 14:10 # 0
http://ru.wikipedia.org/wiki/Французский_республиканский_календарь
3.14159265 10.03.2014 14:27 # 0
Soul_re@ver 10.03.2014 14:39 # +1
256, кстати был бы 16 прериаля.
Ещё в плюсах — фиксированный день недели. Больше одного календаря не понадобится, да и тот не нужен, если можешь считать в уме на уровне 5 класса.
3.14159265 10.03.2014 14:20 # 0
bormand 10.03.2014 07:51 # +1
Ну как вариант - двоичный поиск в сложенном заранее массиве. Или даже захардкоженный поиск в духе: Или может быть даже лукап из массива в 365 ячеек... Х.з., что из этого будет быстрее...
P.S. Но на самом деле, дат в таком формате в выхлопе сервера не так уж много, и всё это байтоёбство мало что даст в плане общей производительности...
3.14159265 10.03.2014 14:26 # +1
> двоичный поиск в сложенном заранее массиве
Думал про оба. Таблица - неплохо, но относительно большая.
Двоичный поиск для малых таблиц зачастую медленее, потому что тупой цикл выполняется быстрее за счёт его тупости и последовательного обращения к памяти.
Как насчёт компромисного варианта: перебирать с шагом 2, а если превысили, то выбирать из 2-х предыдущих.
bormand 10.03.2014 14:49 # +2
Мне кажется, что все-таки таблица на 366 ячеек будет самым эффективным решением - нет переходов, максимум один cache miss на выборку.
3.14159265 10.03.2014 16:15 # 0
bormand 10.03.2014 10:14 # 0
Да, в расчетах то 7 и 12, но в массивах с именами то 8 и 13...
3.14159265 10.03.2014 02:05 # +1
'1','2','3' - очень напрягает кучу кавычек набирать
потому частенько делаю '1,2,3'.split(',')
Elvenfighter 10.03.2014 11:23 # +2
http://ideone.com/tTFkXf
kipar 10.03.2014 15:02 # +2
http://ideone.com/uUFA4K
3.14159265 10.03.2014 16:16 # +4
Никогда не понимал этого - выбор языка из-за какого-то малозначимого сахарка.
В любом популярном и не очень яву можно сделать себе функцию:
qw("1 2 3")
bormand 10.03.2014 16:44 # +3
kipar 10.03.2014 18:47 # −3
bormand 10.03.2014 19:09 # +4
minusator41 10.03.2014 19:19 # −14
Elvenfighter 10.03.2014 22:06 # +2
3.14159265 10.03.2014 19:43 # +3
Да. Кодеры всего мира которых НЕ пишут на руби сейчас неистово негодуют, и выбрасывают свои языки, попутно переучиваясь на ruby потому что не могут записать массив через пробелы.
Проблемы подобного рода исключительно в голове у программиста. А ведь изначально Elvenfighter зеленым написал...
TarasB 11.03.2014 10:08 # 0
qw("1 2 3")
только она не отработает при компиляции
bormand 11.03.2014 10:38 # +1
Засунь ее результат в глобальную статическую переменную. Всем пофиг на эти несколько наносекунд при старте. Да и один хрен в пёрле и руби эта самая "компиляция" происходит примерно в тот же момент (или они уже научились сохранять байткод аля питон?).
guest 12.03.2014 07:03 # 0
inkanus-gray 12.03.2014 07:07 # 0
wvxvw 10.03.2014 22:46 # +2
:/
Баш:
wvxvw 10.03.2014 22:58 # +5
roman-kashitsyn 11.03.2014 08:19 # +2
wvxvw 11.03.2014 09:38 # 0
В Лиспе #(a b c) будет массивом строк.
В J все данные - массивы, интерпретация будет зависеть от читателя.
В большинстве языков не так уж и просто - нужно писать никому не нужные запятые.
roman-kashitsyn 11.03.2014 09:54 # 0
в лиспе хардкодные литералы строк вроде не особо нужны, там символы есть, имхо они более подходят по философию языка.
wvxvw 11.03.2014 10:35 # 0
bormand 11.03.2014 11:05 # +10
roman-kashitsyn 11.03.2014 11:25 # +1
(c) Walter Bright
j123123 12.03.2014 06:13 # +1
Не проще ли сделать возвращаемый буфер на один байт больше?
bormand 12.03.2014 06:47 # +3
Байтоёбы, чо. Экономят на спичках в многомегабайтном бинарнике.
Lure Of Chaos 13.03.2014 00:56 # 0
bormand 13.03.2014 05:47 # 0
guest 30.05.2014 04:45 # 0
bormand 30.05.2014 05:13 # +4
inkanus-gray 24.11.2014 18:03 # 0
inkanus-gray 17.04.2016 01:15 # 0
j123123 01.01.2019 18:42 # 0
bormand 01.01.2019 18:43 # 0
HoBorogHuu_nemyx 01.01.2019 18:52 # 0