malloc free인가 아니면..계산인가..선택의 기로에서..

bxhs의 이미지

프로그램을 짜는데 두가지 중에서 하나를 선택하려구 합니다.
(이건 취미로 하는것입니다. 현재 백수가 되서리..ㅋㅋㅋ)

그냥 최적화 신경안쓰고 짜면 편한데..성격이 그렇지 못해서..
고민중인데요..
사실 둘다 크게 무리는 없습니다.
선택은 둘중의 하나입니다.

==============================
1)안: malloc free해서 어떤 정보를 담아둡니다.

그 정보를 기본으로 해서 그 이후에는 별로 계산할 필요없이
바로 접근할수가 있습니다.

그리고 코드가 좀더 편해집니다.
단점은 그만큼 메모리가 든다는 것이죠..
2)안보다 약 30% 더 먹습니다.

===================================

2)안: 정보를 필요할때마다 계산합니다.

그래서 중복된 계산(코드로는 분리불가능한)이 3,4번 반복되게 됩니다.

단점은 코딩이 좀 보기 안좋고, 시간이 많이 걸립니다.

장점은 메모리가 적게 든다는 것이죠.

====================================

처음에는 1)안을 선택할려구 했는데..

malloc, free를 예를 들어 십만번 하게 된다면..
그 안정성이 의심이 되기도 하고,
왠지 필요없는 메모리를 유지한다는게 솔직히 좀 꺼림직 합니다.
그래서 2)안을 하자니...또 고민이 되고..

여러분의 고견은 어떠신지요?!?!

pynoos의 이미지

정확히 어떤 상황때문에 무엇을 고민하시는지 글을 읽어서 명확하지않습니다.

좀더자세한... 설명 부탁드립니다.

malloc / free 가 많이 사용될때 불안한 것은 memory 단편화가 많이 일어나는 것외에 관리하는데 불안해지는 것은 없습니다.

다만, 할당받은 영역을 넘어서 접근하는 코드상의 문제가 존재하기 때문이겠죠.

서지훈의 이미지

물론 님과 같이 최적화에 신경을 써서 코딩을 하는건 처음 공부할 때 어느 정도 필요도 하고 할 수만 있으면 좋습니다.
그러나 실제로는 꼭 필요한 부분에만 이러한 정책을 적용하고 특정 프로그래밍(server or daemon)에서의 누수만 막으면 됩니다.
요즘 같이 메모리와 주변의 환경에 빵빵한 상태에서 일일이 신경을 다 써주는것에는 문제가 있을 듯합니다.
그리고 현재 어떠한 프로그래밍을 어떠한 방법으로 할려구 하시는지 잘은 이해가 가지 않는 상황이네요...-_-ㅋ
그냥 여담이니 크게 신경은 쓰지 마세요...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

cedar의 이미지

bxhs wrote:

1)안: malloc free해서 어떤 정보를 담아둡니다.

그 정보를 기본으로 해서 그 이후에는 별로 계산할 필요없이
바로 접근할수가 있습니다.

그리고 코드가 좀더 편해집니다.
단점은 그만큼 메모리가 든다는 것이죠..

2)안보다 약 30% 더 먹습니다.

===================================

2)안: 정보를 필요할때마다 계산합니다.

그래서 중복된 계산(코드로는 분리불가능한)이 3,4번 반복되게 됩니다.

단점은 코딩이 좀 보기 안좋고, 시간이 많이 걸립니다.

장점은 메모리가 적게 든다는 것이죠.

====================================

처음에는 1)안을 선택할려구 했는데..
malloc, free를 예를 들어 십만번 하게 된다면..
그 안정성이 의심이 되기도 하고,
왠지 필요없는 메모리를 유지한다는게 솔직히 좀 꺼림직 합니다.
그래서 2)안을 하자니...또 고민이 되고..

임베디드 프로그래밍과 같이 극단적으로 메모리가 부족한 경우가 아니라면,
1번을 선택하는게 맞습니다.
메모리 할당/해제를 엄청 많이 하신다고 했는데,
pynoos님 말씀대로 안정성 저하 문제는 없고요,
메모리 단편화(fragmentation)가 성능을 저하시키는 문제가 있지만
심각하게 속도를 저하시키지는 경우는 드뭅니다.
메모리 단편화를 줄이려면, 앞으로 필요한 메모리까지 가능한 한 많이 한번에 미리 할당해 놓는 것이 좋습니다.

메모리를 많이 사용할 수록 속도가 향상되는 것이 최적화의 제일 원칙입니다.
극단적인 속도 최적화가 필요하다면 루프(for, while)를 사용한 재계산 대신 아예 메모리에 중간 계산값을 전부 올려놓고 사용하실 것을 권합니다.

More Effective C++, Item 18에 따르면 속도 최적화를 위해서는
과도 선행 평가(過度先行平價, over-eager evaluation)의 원칙을 사용할 것을 권합니다. 시키지도 않은 일을 미리 해 놓으라는 거죠.
이미 계산이 끝났지만, 앞으로 다시 사용될 가능성이 있는 값은
버리지 않고 그냥 두는 캐싱(caching)이나, 동적 배열이나 해쉬 테이블을 사용할 때, 메모리의 증가량은 현재 할당된 메모리의 두 배 이상으로 한다든지 하는 프리페칭(prefetching, 미리 가져오기)과 같은 전략을 사용한다든지 하는 것들 말이죠. 정리하면, 어떤 작업의 결과가 한 번 이상 다시 사용될 가능성이 있다면, 그 작업을 미리 해두고 버리지 말라는 것입니다.

절대 메모리를 아까워하지 마시고, 가능한 많이 사용해서 속도를 향상시키세요.

xfmulder의 이미지

혼자 알고리즘이나 성능 향상을 위한 공부라면 2안이 낫습니다.
프로젝트이거나 자신이 계속 유지보수해야할 일이 아니라면 당연 1안입니다.

저는 모든 프로그램에서 먼저 고려하는게 리소스를 아끼고 성능을 높이는 것입니다.
그리고 그 다음이 가독성입니다만 ,
별로 안좋은 습관입니다.

다른사람에게 쉽게 이해되고 확장하기 쉽도록 약간의 여분을 두고 짜시는게 낫습니다. 진짜 실력발휘는 메인루프에서 아주 잘 짜시면 성능도 높아집니다.
그럼...

내 자식들도 나처럼 !!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.