2016-04-20 2 views

ответ

2

Переместите переназначения на внешнюю петлю так ofile.txt только открыт один раз.

for j in {1..339}; do 
    for i in {1..427}; do 
    echo -e "$j\t$i" 
    done 
done >> ofile.txt 

Это, вероятно, также лучше использовать C-стиль для петли, чтобы предотвратить эти фигурные скобки от необходимости быть расширен, хотя я не профилированного его. Это меньшая оптимизация.

for ((j = 1; j <= 339; ++j)); do 
    for ((i = 1; i <= 427; ++i)); do 
    echo -e "$j\t$i" 
    done 
done >> ofile.txt 
+0

'done> ofile.txt' может быть больше того, что предполагал ОП, но он не уточнил. – agc

1

perl -e ' 
for my $j (1..339) { 
    for my $i (1..427) { 
    print "$j\t$i\n"; 
    } 
} 
' > ofile.txt 
3

здесь одна альтернатива без явных петель

join -j9 -t$'\t' <(seq 339) <(seq 427) | cut -f2- > ofile.txt 
2

Karakfa «s меня ThOD, без сократить:

join -j9 -o 1.1,2.1 -t$'\t' <(seq 339) <(seq 427) > ofile.txt

контрольные показатели, используя Баш «s встроенной времени команды, только 'реальный' номер, (который разнится несколько от системы к системе, мой процессор около 4390 BogoMips):

  • присоединиться (Karakfa-АРУ): .029s
  • присоединитьсяпокрой, Karakfa): .039s
  • мой (Szilágyi): .086s
  • Perl (Османов): .092s
  • awk (Morton): .139s
  • тире (АРУ): 1.159s
  • Баш (Kugelman): 2.153s
  • Баш (Kayan - О.П.): 3.001s

Takeaway : join обеспечивает 100-кратное ускорение.

1

POSIX оболочки, с SEQ:

#!/bin/dash 
for j in `seq 339`;do 
    for i in `seq 427`;do 
    echo $j\\\t$i 
    done 
done > ofile.txt 
2
cat my.c 

#include <stdio.h> 
#include <stdlib.h> 

main(n,s)int n; char **s;{ 
int i, j; 
if(n!=3)exit(1); 
for(i=1; i<=atoi(s[1]); i++) 
    for(j=1; j<=atoi(s[2]); j++) 
    printf("%4d %4d\n",i,j); 
} 

gcc my.c -o my 

time ./my 339 427 >ofile.txt 
real 0m0.035s 
user 0m0.024s 
sys 0m0.008s 

cat karakfa_agc_solution 
join -j9 -o 1.1,2.1 -t$'\t' <(seq 339) <(seq 427) > ofile.txt 

time ./karakfa_agc_solution >ofile.txt 
real 0m0.032s 
user 0m0.012s 
sys 0m0.008s 

cat /proc/cpuinfo |grep bogo 
bogomips : 6629.54 

Я не мог сделать более быстрый код в C также.

+0

Компиляция в моей системе (Intel Core i3-2330M) выполняется на 2 или 3 раза медленнее, чем * join *. Ваша коробка должна иметь другую архитектуру или лучшие настройки компилятора по умолчанию - возможно, есть несколько менее относительных эталонных инструментов. В любом случае это: '#include #include int main (n, s) int n; char ** s; { if (n! = 3) exit (1); int i, im = atoi (s [1]), j, jm = atoi (s [2]); для (i = 1; i <= im; i ++) для (j = 1; j <= jm; j ++) printf ("% - d \ t% -d \ n", i, j); } 'сделал это на 30% быстрее ... Off, чтобы посмотреть исходный код * join *, посмотрим, как они это сделали ... – agc

+0

Проверенный источник: для вывода * join * uses * putchar() *, * fputs() * и * fwrite() *. – agc

+0

Мой процессор: AMD Phenom (tm) II X2 560 Процессор (3,3 ГГц) –

1

Существует немного более быстрый код C с функцией fwrite() и с таблицей кодов ASCII (ref to @agc).

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define L 6     // max digit 

main(n,s)int n; char **s;{ 
unsigned int i, j, k, m1, m2, mx; 
char *p; 

if(n!=3){printf("Usage %s num1 num2\n", s[0]); exit(__LINE__);} 
m1=atoi(s[1]); m2=atoi(s[2]); 
if(!(m1*m2)|| strlen(s[1])>L|| strlen(s[2])>L)exit(__LINE__); 

mx=m1>m2?m1:m2;    // max input num 

// allocate and init ASCII code tbl for the bigest inp oper 
if(!(p=(char *)malloc((mx+1)*(L+2))))exit(__LINE__); 
if(!memset(p, ' ', (mx+1)*(L+2)))exit(__LINE__); 
for(i=1; i<=mx; i++){ 
    for(j=i,k=L-1; j; j/=10,k--)p[i*(L+2)+k]=j%10+'0'; 
    p[i*(L+2)+L]='\t'; p[i*(L+2)+L+1]='\n';} 

for(i=1; i<=m1; i++)   //print variants from ASCII tbl 
    for(j=1; j<=m2; j++){ 
    fwrite(p+(L+2)*i, L+1, 1,stdout); 
    fwrite(p+(L+2)*j, L+2, 1,stdout);} 
} 

gcc -o optf optf.c 

time ./optf 339 427 >ofile.txt 
real 0m0.010s 
user 0m0.004s 
sys 0m0.004s 
bogomips :6629 
architecture:AMD Phenom(tm) II X2 560 
Смежные вопросы