내가 작성한 기타 코드 중 대부분은 CCAN에 있으며 나머지는 기존 오픈 소스 프로젝트에서 더 나은 버전을 찾는 경향이 있습니다. 요즘에는 응용 프로그램 별 변형을 작성하거나 스스로 릴리스 할 수있는 범용 모듈을 작성하기 위해 점점 덜 범용적인 "misc"코드를 작성하고 있습니다.
기음
여기에 함수와 typedef가 두 번 이상 사용되었습니다. 타이밍이 필요한 애플리케이션의 경우 단순성 측면에서 밀리 초를이기는 것은 어렵습니다.
#include <stdint.h>
#include <sys/time.h>
typedef int64_t msec_t;
static msec_t time_ms(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (msec_t)tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
그리고 반복해서 사용하는 경향이있는 더 많은 C 함수 :
/* Remove a trailing newline, if present. */
void chomp(char *buffer)
{
if (!*buffer)
return;
while (*buffer)
buffer++;
if (buffer[-1] == '\n')
buffer[-1] = 0;
}
/*
* Skip whitespace, update the pointer, and return it.
* Example:
*
* switch (*skipSpace(&s)) {
* case '\0':
* ...
* case '(':
* ...
*/
const char *skipSpace(const char **sptr)
{
const char *s = *sptr;
while (isspace(*s))
s++;
*sptr = s;
return s;
}
/* Scramble an array of items uniformly. */
void scramble(void *base, size_t nmemb, size_t size)
{
char *i = base;
char *o;
size_t sd;
for (;nmemb>1;nmemb--) {
o = i + size*(rand()%nmemb);
for (sd=size;sd--;) {
char tmp = *o;
*o++ = *i;
*i++ = tmp;
}
}
}
하스켈
Haskell의 nub :: (Eq a) => [a] -> [a]
함수는 타입 시그니처에 의해 두 요소가 같은지 테스트 만 가능하기 때문에 O (n²)입니다. 간단한 O (n log n) 대안은 map head . group . sort
출력을 생성하기 전에 전체 입력 목록을 강제 실행해야하지만 nub
출력을 즉시 시작할 수 있습니다. 다음은 A에서 nub
이미 본 항목을 수집 하는 O (n log n) 대안 입니다 Data.Set
.
module Nub (nub') where
import Prelude
import Data.Set (empty, member, insert)
nub' :: Ord a => [a] -> [a]
nub' xs = loop xs empty where
loop [] _ = []
loop (x:xs) set =
if x `member` set
then loop xs set
else x : loop xs (insert x set)
하스켈, 나는 대체 사용 sequence
, mapM
, forM
, replicateM
,와 filterM
. 이러한 작업은 각각 목록을 생성하지만 작업이 완전히 완료 될 때까지 (IO와 같은 엄격한 모나드를 사용하는 경우) 목록을 사용할 수 없습니다. 대안은 적어도 GHC를 사용하여 벤치마킹을 통해 더 빠른 것으로 나타났습니다.
sequence' :: Monad m => [m a] -> m [a]
sequence' ms = loop ms [] >>= return . reverse where
loop [] xs = return xs
loop (m:ms) xs = do
x <- m
loop ms (x:xs)
mapM' :: Monad m => (a -> m b) -> [a] -> m [b]
mapM' f xs = sequence' $ map f xs
forM' :: Monad m => [a] -> (a -> m b) -> m [b]
forM' = flip mapM'
replicateM' :: Monad m => Int -> m a -> m [a]
replicateM' n x = sequence' (replicate n x)
filterM' :: Monad m => (a -> m Bool) -> [a] -> m [a]
filterM' pred xs = loop xs [] >>= return . reverse where
loop [] xs' = return xs'
loop (x:xs) xs' = do
keep <- pred x
loop xs (if keep then (x:xs') else xs')
참고 : sequence_
, mapM_
, forM_
, 그리고 replicateM_
당신이 결과 목록에 관심이없는 경우 기능은 여전히 더 나은 선택입니다.