自製str_copy関数のwhile文をポインタ変数の加算で書くと高速化できました。
以下のコードをそれぞれ走らせ処理時間を測ったところ、リストのインデックス加算に比べて1.5倍の速さになります。
strcpy関数はポインタ変数の加算になっているようです。
#include <stdio.h>
char *str_copy(char *d, const char *s)
{
char *t = d;
while (*d++ = *s++)
;
return t;
}
int main(void)
{
char str[128] = "ABC";
char tmp[128] = "DEF";
printf("str = \"%s\"\n", str);
str_copy(str, tmp);
puts("コピーしました。");
printf("str = \"%s\"\n", str);
return 0;
}
#include <stdio.h>
char *str_copy(char *d, const char *s)
{
int i=0;
while (d[i] = s[i])
i++;
return d;
}
int main(void)
{
char str[128] = "ABC";
char tmp[128] = "DEF";
printf("str = \"%s\"\n", str);
str_copy(str, tmp);
puts("コピーしました。");
printf("str = \"%s\"\n", str);
return 0;
}
import subprocess,time,datetime
start = time.time()
proc = subprocess.run("list1106_mac2", shell=True, stdout= subprocess.PIPE, stderr = subprocess.PIPE)
print(proc.stdout.decode('UTF-8'))
# 処理時間算出
process_time = time.time() - start
td = datetime.timedelta(seconds = process_time)
dt_now = datetime.datetime.now()
print('ポインタ加算 処理終了 ' + str(td) + ' ' + str(dt_now))
start2 = time.time()
proc = subprocess.run("list1106a_mac2", shell=True, stdout= subprocess.PIPE, stderr = subprocess.PIPE)
print(proc.stdout.decode('UTF-8'))
# 処理時間算出
process_time2 = time.time() - start2
td2 = datetime.timedelta(seconds = process_time2)
dt_now2 = datetime.datetime.now()
print('インデックス加算 処理終了 ' + str(td2) + ' ' + str(dt_now2))
--------------------------------------------------
出力
--------------------------------------------------
str = "ABC"
コピーしました。
str = "DEF"
ポインタ加算 処理終了 0:00:00.007981 2021-07-20 14:05:55.569973
str = "ABC"
コピーしました。
str = "DEF"
インデックス加算 処理終了 0:00:00.012111 2021-07-20 14:05:55.582141