콤팩트 코드 및 에너지 효율적 소프트웨어
마이크로 프로세서 칩이 새로 발명되었던 컴퓨터의 암흑기에는 엔지니어링을 전공한 초보 엔지니어가 DEC PDP-11 미니컴퓨터와 같은 기계에서 고도의 컴퓨터 프로그램을 처음 경험해 보는 경우가 많았습니다. 이들은 PDP-11에서 제대로 작동하는 프로그램을 작성하는 것 외에도 코드의 크기를 줄여야 했습니다. 초기의 컴퓨터 강사를 화나게 하는 방법 중 한 가지는 15행의 어셈블리 코드로 가능할 프로그램을 20행으로 만드는 것이었습니다. 그 이유는 물론 메모리가 비쌌기 때문이었습니다. PDP-11의 읽기/쓰기 메모리는 보통 유선으로 액세스할 수 있는 22mil 자기 코어로 구성된 16비트 단어 4,096개가 전부였습니다.
DEC(Digital Equipment Corporation)의 PDP-11 컴퓨터 (이미지 출처: flickr)
오늘날에도 프로그래밍 과정에서는 콤팩트 코드의 중요성을 강조합니다. 하지만 프로그래밍 강의는 콤팩트 코드를 작성하는 것이 아니라 에너지 소비를 최소화하는 소프트웨어에 중점을 두게 될 것으로 보입니다.
컴퓨터 코드 에너지 효율성은 과거에 많은 주목을 받지 못했습니다. MCU의 내전력을 꾸준히 사용하여 전력을 공급하는 코인 셀의 수명을 최대화해야 하는 소형 내장형 시스템 프로그래머들이 주로 여기에 관심을 가지고 있었습니다. 이제는 소프트웨어 에너지 효율성이 주요 관심사가 되었습니다. 스마트폰 사용자가 전화기 배터리를 좀 더 효율적으로 사용하기 위해 CPU 집약적인 앱을 지양하는 경우가 점점 많아지고 있습니다. 소프트웨어 에너지 효율성이 데이터 센터의 탄소 배출량에 영향을 주기 때문에 클라우드 기반 시스템도 여기에 관심을 기울이고 있습니다.
얼핏 보면 콤팩트 코드는 이미 에너지 효율성이 뛰어나다고 생각할 수 있습니다. 이러한 일반적인 원칙은 경우에 따라 적합하지만 항상 그런 것은 아닙니다. 또한 컴퓨터 프로그램의 에너지 효율성은 대개 작성된 언어에 따라 달라집니다. 컴파일 언어는 번역된 언어나 가상 머신을 구성하는 언어보다 에너지 효율성이 뛰어납니다. 하지만 서로 연관된 것처럼 보이는 컴파일 언어 사이에서도 에너지 효율성의 차이가 클 수 있습니다.
포르투갈에서 진행된 연구(https://dl.acm.org/doi/10.1145/3136014.3136031) 결과, 에너지 효율성이 뛰어난 프로그래밍에 사용되는 에너지, 시간, 메모리에 대한 통계자료를 얻을 수 있었습니다. 이들은 소프트웨어 언어 27종의 에너지 효율성을 분석했습니다. 이를 위해 첨단 컴파일러, 인터프리터, 가상 머신을 사용하여 널리 사용되는 알고리즘이 대표적인 다양한 프로그램언어로 실행되는지 비교하는 데 사용되는 13가지 프로그램을 실행하면 어떻게 되는지 관찰했습니다.
예를 들어 한 벤치마크 프로그램은 하나의 시스템 내 여러 파티클 간 상호작용을 계산하는 데 걸린 시간을 측정했습니다. 또 다른 프로그램은 수많은 2진 트리를 할당하고 할당을 해제했습니다. 세 번째 프로그램은 해시표를 업데이트하여 특정 DNA 뉴클레오티드 시퀀스를 계산했습니다.
연구자들은 소프트웨어의 에너지 소비량이 실행 시간에 비례하므로 언제나 빠를수록 좋다는 생각은 오해라고 말합니다. 즉, 프로그램의 실행 시간을 단축하면 에너지 소비량도 같은 비율로 줄어들 것이라는 생각입니다. 하지만 단순히 전력 사용량과 시간으로 인해 에너지가 손실되기 때문에 이러한 관계가 발생하는 것은 아닙니다. 따라서 빠른 프로그램이라고 해도 실행되면서 더 많은 전력을 소비하는 경우에는 에너지 효율성이 뛰어나지 않을 수 있습니다.
이로 인해 연구자들은 프로그래밍 언어의 에너지 소비량 순위가 실행 시간 순위와 일치하지 않는 경우를 발견했습니다. 예를 들어 무작위 DNA 시퀀스를 생성하고 작성하는 데 사용되는 벤치마크에서는 Fortran이 두 번째로 에너지 효율성이 뛰어난 것으로 나타났지만 실행 시간은 8번째였습니다. 2진 트리 컴퓨팅 시, Pascal 언어와 Chapel 언어의 에너지 소비량은 서로 10% 이내였지만 Chapel 언어의 실행 시간이 약 55% 짧았습니다.
일부 연구자들은 놀랍지 않은 결론을 냈습니다. 한 가지 관찰 결과로, C 언어는 전체적으로 가장 빠르고 에너지 효율성도 가장 뛰어납니다(57J, 실행 시간 평균 2,019msec). C에 뒤이어 벤치마크 실행에 가장 적은 에너지와 시간을 요하는 4가지 언어는 Rust(59J, 2,103msec), C++(77J, 3,155msec), Ada(98J, 3,740msec), Java(114J, 3,821msec)인 것으로 드러났습니다. 그리고 예상한대로, 컴파일 언어가 번역된 언어 또는 가상 머신 언어보다 에너지 효율성이 훨씬 뛰어났습니다. 컴파일된 프로그램은 솔루션을 실행하는 데 평균 120J을 소비했고, 가상 머신 및 번역된 언어는 각각 5,760J과 2,365J을 소비했습니다.
에너지 효율성과 실행 시간이 가장 뒤떨어지는 5가지 언어는 모두 번역된 언어였습니다. 에너지의 경우 Perl(4,604J), Python(4,390J), Ruby(4,045J), JRuby(2,693J), Lua(2,660J), 시간의 경우 Lua(16,7416msec), Python(14,5178msec), Perl(13,2856msec), Ruby(119,832msec), TypeScript(93,292msec)였습니다.
또한 이 연구에서는 소모된 에너지의 대부분이 어디로 가는지도 밝혔습니다. CPU 기반 에너지 소비는 소비되는 에너지의 대부분을 차지합니다. 언어가 컴파일되었는지, 번역되었는지, 가상인지 상관없이 평균적으로 CPU가 에너지의 거의 90%를 소비하고 DRAM이 나머지를 소비합니다.
요약하자면, 포르투갈 연구자들은 개발자가 실행 시간과 에너지 소비량에 주의한다면 가장 효율적인 소프트웨어 언어를 비교적 쉽게 선택할 수 있다고 말합니다. 하지만 메모리 사용량도 개입되는 경우에는 간단하지 않습니다.
지구를 위한 좋은 소식은 소프트웨어를 에너지 효율성에 최적화할 수 있다는 것입니다. 반면 프로그래밍을 배우는 학생들에게는 나쁜 소식이 있습니다. 이제 최대한 콤팩트 프로그램을 만드는 것뿐만 아니라 에너지 효율성을 만드느라 프로그래밍 강사의 눈치를 보아야 할 수 있다는 것입니다.
Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum