Skip to content
리눅스/BSD

생코를 보다가~ 이번에는 perl과 + bash + bc 1000000! 팩토리얼 덕후짓!

by 흑엽 posted Aug 01, 2015

오늘 이 테스트는 알고리즘보다는
리눅 bash명령어로 백만개의 곱샘 명령을(1000000!<-팩토리얼 계산) 순수하게 그대로 셀상에서 bc로 넘겼을때 메모리 오버 등등의, 에러 없이 완벽하게 돌아가는지가 너무 궁금해서 해본 덕후짓입니다. 8년전 컴퓨터에 vmware깔고 500매가 가상 램 상황에서 테스트 했습니다.

==========


cat 오늘_생코보고_만든_팩토리얼_계산.pl
#!/usr/bin/perl


my $cmd = "1";
my $loopEnd =$ARGV[0] +1;
my $twoCnt = 0;
for (my $i = 2; $i < $loopEnd; $i++){
        $cmd = $cmd . "*" . $i;
        $twoCnt = $twoCnt  + 1;
        if($twoCnt >= 100) {
 #100마다 출력하지 않으면 문자열이 너무많이 누적됨에 따라 문자열 합치는데만 너무 오래 걸림. 이렇게 하면  0.5초면 1000000개의 곱샘 공식이 담긴 문자열 출력이 완료됨. 만약 한번에 하면 변수가 백만개 정도 누적된때까지  변수의 크기가 증가 됨에 따라 몇십분 이상 걸릴듯... 메모리 오버가 뜰수도 있음. 본인은 10분 기다리다가 귀찬아서 바로...코드 고침...ㅡ.ㅡ;;; 
 # 실행예) time ./해당스크립트.pl 1000000 결과.... $real  0m0.504s시간만큼 걸림. 이것을 또 다시 bash상 큰따음표를 통해서 echo해서 bc로 넘겨 주는것임.
                $twoCnt = 0;
                print $cmd;
                $cmd = ""; #한번 출력을 했기 때문에 자료를 비워준다.
        }
}
print $cmd;# 루프 빠져나간 마지막에도 꼭... 출력해줘야지
==========


프로그램 실행 명령어(time명령어는 프로그램 실행 시간을 체크하기 위함)
time echo `./오늘_생코보고_만든_팩토리얼_계산.pl 1000000`|bc > BcResult.txt
==========


위 프로그램 실행에 걸린 시간
real    661m38.318s <--10시간 넘게 걸림. 돌리고 그냥 잤음ㅡ.ㅡ;;; 어제 블로그에 올린 http://ipc.pe.kr/27317 c언어로 만든것은 5분 걸림. 생코 고수분이 64비트 cpu 8코어 다쓰도록 알고리즘 짜 놓으신 것이 있는데 그건 2초안에 끝남.
user    525m22.858s
sys     135m7.803s
$ ls -lh|egrep BcResult 의 결과
5.5M Jul 31 13:46 BcResult.txt <--계산 결과가 담겨있는 500만자리의 숫자 문자열이 담겨 있는 txt파일 용량.
그리고 어제 c언어로 만든 계산 결과와도 일치함을 WinMerge를 통해 확인!
==========


참고로...
./오늘_생코보고_만든_팩토리얼_계산.pl 1000000
만 했을 경우 위의 코드처럼 문자열  100번 누적될때마 줄바꿈없이 아래와 같은 연산기호를 화면에 뿌려준다.

1*2*3*4*5*6*7*8*9*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*56*57*58*59*60*61*62*63*64*65*66*67*68*69*70*71*72*73*74*75*76*77*78*79*80*81*82*83*84*85*86*87*88*89*90*91*92*93*94*95*96*97*98*99*100*101*102*103*104*105*106*107*108*109*110*111*112*113*114*115*116*117*118*119*120*121*122*123*124*125*126*127*128*129*130*131*132*133*134*135*136*137*138*139*140*141*142*143*144*145*146*147*148*149*150*151*152*153*154*155*156*157*158*159*160*161*162*163*164*165*166*167*168*169*170*171*172*173*174*175*176*177*178*179*180*181*182*183*184*185*186*187*188*189*190*191*192*193*194*195*196*197*198*199*200*201*202*203*204*205*206*207*208*209*210*211*212*213*214*215*216*217*218*219*220*221*222*223*224*225*226*227*228*229*230*231*232*233*234*235*236*237*238*239*240*241*242*243*244*245*246*247*248*249*250*251*252*253*254*255*256*257*258*259*260*261*262*263*264*265*266*267*268*269*270*271*272*273*274*275*276*277*278*279*280*281*282*283*284*285*286*287*288*289*290*291*292*293*294*295*296*297*298*299*300*301*302*303*304*305*306*307*308*309*310*311*312*313*314*315*316*317*318*319*320*321*322*323*324*325*326*327*328*329*330*331*332*333*334*335*336*337*338*339*340*341*342*343*344*345*346*347*348*349*350*351*352*353*354*355*356*357*358*359*360*361*362*363*364*365*366*367*368*369*370*371*372*373*374*375*376*377*378*379*380*381*382*383*384*385*386*387*388*389*390*391*392*393*394*395*396*397*398*399*400*401*402*403*404*405*406*407*408*409*410*411*412*413*414*415*416*417*418*419*420*421*422*423*424*425*426*427*428*429*430*431*432*433*434*435*436*437*438*439*440*441*442*443*444*445*446*447*448*449*450*451*452*453*454*455*456*457*458*459*460*461*462*463*464*465*466*467*468*469*470*471*472*473*474*475*476*477*478*479*480*481*482*483*484*485*486*487*488*489*490*491*492*493*494*495*496*497*498*499*500*501*502*503*504*505*506*507*508*509*510*511*512*513*514*515*516*517*518*519*520*521*522*523*524*525*526*527*528*529*530*531*532*533*534*535*536*537*538*539*540*541*542*543*544*545*546*547*548*549*550*551*552*553*554*555*556*557*558*559*560*561*562*563*564*565*566*567*568*569*570*571*572*573*574*575*576*577*578*579*580*581*582*583*584*585*586*587*588*589*590*591*592*593*594*595*596*597*598*599*600*601*602*603*604*605*606*607*608*609*610*611*612*613*614*615*616*617*618*619*620*621*622*623*624*625*626*627*628*629*630*631*632*633*634*635*636*637*638*639*640*641*642*643*644*645*646*647*648*649*650*651*652*653*654*655*656*657*658*659*660*661*662*663*664*665*666*667*668*669*670*671*672*673*674*675*676*677*678*679*680*681*682*683*684*685*686*687*688*689*690*691*692*693*694*695*696*697*698*699*700*701*702*703*704*705*706*707*708*709*710*711*712*713*714*715*716*717*718*719*720*721*722*723*724*725*726*727*728*729*730*731*732*733*734*735*736*737*738*739*740*741*742*743*744*745*746*747*748*749*750*751*752*753*754*755*756*757*758*759*760*761*762*763*764*765*766*767*768*769*770*771*772*773*774*775*776*777*778*779*780*781*782*783*784*785*786*787*788*789*790*791*792*793*794*795*796*797*798*799*800*801*802*803*804*805*806*807*808*809*810*811*812*813*814*815*816*817*818*819*820*821*822*823*824*825*826*827*828*829*830*831*832*833*834*835*836*837*838*839*840*841*842*843*844*845*846*847*848*849*850*851*852*853*854*855*856*857*858*859*860*861*862*863*864*865*866*867*868*869*870*871*872*873*874*875*876*877*878*879*880*881*882*883*884*885*886*887*888*889*890*891*892*893*894*895*896*897*898*899*900*901*902*903*904*905*906*907*908*909*910*911*912*913*914*915*916*917*918*919*920*921*922*923*924*925*926*927*928*929*930*931*932*933*934*935*936*937*938*939*940*941*942*943*944*945*946*947*948*949*950*951*952*953*954*955*956*957*958*959*960*961*962*963*964*965*966*967*968*969*970*971*972*973*974*975*976*977*978*979*980*981*982*983*984*985*986*987*988*989*990*991*992*993*994*995*996*997*998*999*1000*1001*1002*1003*1004*1005*1006*1007*1008*1009*1010*1011*1012*1013*1014*1015*1016*1017*1018*1019*1020*1021*1022*1023*1024*1025*1026*1027*1028*1029*1030*1031*1032*1033*1034*1035*1036*1037*1038*1039*1040*1041*1042*1043*1044*1045*1046*1047*1048*1049*1050*1051*1052*1053*1054*1055*1056*1057*1058*1059*1060*1061*1062*1063*1064*1065*1066*1067*1068*1069*1070*1071*1072*1073*1074*1075*1076*1077*1078*1079*1080*1081*1082*1083*1084*1085*1086*1087*1088*1089*1090*1091*1092*1093*1094*1095*1096*1097*1098*1099*1100*1101*1102*1103*1104*1105*1106*1107*1108*1109*1110*1111*1112*1113*1114*1115*1116*1117*1118*1119*1120*1121*1122*1123*1124*1125*1126*1127*1128*1129*1130*1131*1132*1133*1134*1135*1136*1137*1138*1139*1140*1141*1142*1143*1144*1145*1146*1147*1148*1149*1150*1151*1152*1153*1154*1155*1156*1157*1158*1159*1160*1161*1162*1163*1164*1165*1166*1167*1168*1169*1170*1171*1172*1173*1174*1175*1176*1177*1178*1179*1180*1181*1182*1183*1184*1185*1186*1187*1188*1189*1190*1191*1192*1193*1194*1195*1196*1197*1198*1199*1200*1201*1202*1203*1204*1205*1206*1207*1208*1209*1210*1211*1212*1213*1214*1215*1216*1217*1218*1219*1220*1221*1222*1223*1224*1225*1226*1227*1228*1229*1230*1231*1232*1233*1234*1235*1236*1237*1238*1239*1240*1241*1242*1243*1244*1245*1246*1247*1248*1249*1250*1251*1252*1253*1254*1255*1256*1257*1258*1259*1260*1261*1262*1263*1264*1265*1266*1267*1268*1269*1270*1271*1272*1273*1274*1275*1276*1277*1278*1279*1280*1281*1282*1283*1284*1285*1286*1287*1288*1289*1290*1291*1292*1293*1294*1295*1296*1297*1298*1299*1300*1301*1302*1303*1304*1305*1306*1307*1308*1309*1310*1311*1312*1313*1314*1315*1316..............(생략!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!).......*999644*999645*999646*999647*999648*999649*999650*999651*999652*999653*999654*999655*999656*999657*999658*999659*999660*999661*999662*999663*999664*999665*999666*999667*999668*999669*999670*999671*999672*999673*999674*999675*999676*999677*999678*999679*999680*999681*999682*999683*999684*999685*999686*999687*999688*999689*999690*999691*999692*999693*999694*999695*999696*999697*999698*999699*999700*999701*999702*999703*999704*999705*999706*999707*999708*999709*999710*999711*999712*999713*999714*999715*999716*999717*999718*999719*999720*999721*999722*999723*999724*999725*999726*999727*999728*999729*999730*999731*999732*999733*999734*999735*999736*999737*999738*999739*999740*999741*999742*999743*999744*999745*999746*999747*999748*999749*999750*999751*999752*999753*999754*999755*999756*999757*999758*999759*999760*999761*999762*999763*999764*999765*999766*999767*999768*999769*999770*999771*999772*999773*999774*999775*999776*999777*999778*999779*999780*999781*999782*999783*999784*999785*999786*999787*999788*999789*999790*999791*999792*999793*999794*999795*999796*999797*999798*999799*999800*999801*999802*999803*999804*999805*999806*999807*999808*999809*999810*999811*999812*999813*999814*999815*999816*999817*999818*999819*999820*999821*999822*999823*999824*999825*999826*999827*999828*999829*999830*999831*999832*999833*999834*999835*999836*999837*999838*999839*999840*999841*999842*999843*999844*999845*999846*999847*999848*999849*999850*999851*999852*999853*999854*999855*999856*999857*999858*999859*999860*999861*999862*999863*999864*999865*999866*999867*999868*999869*999870*999871*999872*999873*999874*999875*999876*999877*999878*999879*999880*999881*999882*999883*999884*999885*999886*999887*999888*999889*999890*999891*999892*999893*999894*999895*999896*999897*999898*999899*999900*999901*999902*999903*999904*999905*999906*999907*999908*999909*999910*999911*999912*999913*999914*999915*999916*999917*999918*999919*999920*999921*999922*999923*999924*999925*999926*999927*999928*999929*999930*999931*999932*999933*999934*999935*999936*999937*999938*999939*999940*999941*999942*999943*999944*999945*999946*999947*999948*999949*999950*999951*999952*999953*999954*999955*999956*999957*999958*999959*999960*999961*999962*999963*999964*999965*999966*999967*999968*999969*999970*999971*999972*999973*999974*999975*999976*999977*999978*999979*999980*999981*999982*999983*999984*999985*999986*999987*999988*999989*999990*999991*999992*999993*999994*999995*999996*999997*999998*999999*1000000
이렇게 문자열로 이루어진 계산식이, 문자열로 이루어진 계산결과보다 크다. 리다이렉션해서 비교해 보면 계산결과는 5.3메가인데 계산식의 경우는 6.57매가임. 곱샘 기호가 포함됨으로 당연히 더 클수 뿐.....
==========


원래는  아래와 같이 셀스크립트로 만들다가 펄이 문자열 생성이 더 빨라서, 순수 셀스크립트로 만든 아래의 코드는 그냥 갔다 버림.

$ cat 오늘_생코에서본_팩토리얼_계산.sh
#!/bin/sh

go="1"

number=2
while [ $number -lt $1 ]
do
        go="${go}*${number}"
        number=`expr $number + 1`
done

go="${go}*${1}"
echo $go "의 계산 결과!!!!:"
#echo $go|bc
=========



Copyright ⓒ 성우 All rights reserved

Powered by SungWoo / Designed by SungWoo

sketchbook5, 스케치북5

sketchbook5, 스케치북5