2009-07-17 3 views
2

문자열을 구현하는 방법이 너무 비싸서 조작하기가 어떨까요?문자열이 비싼 이유는 ​​무엇입니까?

"저렴한"문자열 구현을 수행하는 것이 불가능합니까?

또는 완전히 이해하는데 잘못입니까?

감사합니다.

+0

왜 비싸다고 생각합니까? 그것은 모두 당신이 그들에게하는 일에 달려 있습니다. – Draemon

+0

어떤 환경입니까? C#, JAVA, Perl 또는 다른 것? – SolutionYogi

+1

비싸다는 것은 상대적 용어입니다. 대 .... 비싼 조작하는 비싼? 문자 배열? 정수? 가위? – Falaina

답변

22

어떤 언어입니까?

문자열은 일반적으로 변경할 수 없으므로 데이터를 변경하면 문자열이 새로 만들어집니다. 큰 문자열의 경우 성능에 영향을 줄 수 있습니다.

그러나이 기능은 인턴과 같은 최적화가 가능하기 때문에 중요한 기능입니다. Interning은 동일한 문자열을 동일한 데이터 사본으로 지정하여 텍스트 데이터의 크기를 줄입니다.

문자열에 대한 성능이 염려되는 경우 StringBuilder (C# 및 Java에서 사용 가능) 또는 변경 가능한 텍스트 데이터로 작동하는 다른 구문을 사용하십시오.

많은 양의 텍스트 데이터로 작업하고 공간을 절약하면서 강력한 문자열 솔루션이 필요한 경우 look into using ropes.

+2

+1. 흥미로운 읽기. –

+1

위키 피 디아 링크가 깨 졌습니다. 정규 표현식처럼 보이지 않습니다. –

+0

힌트, 링크 버튼을 사용하십시오. – Dykam

0

모든 조건에서 범용 문자열을 사용하려는 경우 효율성을 희생해야하는 경우가 있습니다. 이것은 빠른 것을 얻는 것와 다른 것을 얻기 사이의 고전적인 절충안입니다. 그래서 ... "표준"문자열을 사용하는 것이 가장 좋습니다 (최적의 방식은 아닙니다). 또는 문자열 구현은 어떤 경우에는 매우 빠르며 다른 경우에는 성가신 것입니다.

은 때때로 당신은 문자열

2

문제는 그들이 기본 유형이 아니라는 것이다 ... 불변성, 때로는 랜덤 액세스, 때로는 빠른 삽입/삭제가 필요합니다. 그것들은 배열입니다. 따라서 배열과 같은 속도 및 메모리 문제가 발생합니다 (몇 가지 최적화가있을 수 있음).

이제 값이 싼 구현에는 연결, indexOf 등 많은 작업이 필요할 것입니다. 이렇게하는 방법은 다양합니다. 너 수 있습니다 구현을 개선하지만, 몇 가지 한계가 있습니다. 문자열은 컴퓨터에서 자연스럽지 않기 때문에 더 많은 메모리가 필요하고 조작 속도가 더 느립니다 ... 항상. 적법한 정수 합 알고리즘보다 문자열 결합 알고리즘을 더 빨리 얻을 수 없습니다.

+1

+1 전적으로 동의합니다. 현대 문자열은 단순 엔터티가 아닙니다. 쉽게 조작 할 수 있도록 제작되었습니다. 이 기능은 필요하지만 값 비쌉니다. .NET String (또는 Python) 대 old school C "string.h"처리 (및 메모리 처리)의 기능 비교 – CMB

1

전적으로 사용자가 수행하려고하는 작업에 따라 다릅니다. 대체로 직접 탐색에서 단일 문자를 대체하지 않는 한 일반적으로 최소 1 개의 새로운 배열 할당이 필요합니다. 가장 단순한 수준에서 문자열은 문자 배열입니다. 그래서 당신이하고 싶은 일은 배열에 새로운 것을 반복, 제거 또는 삽입하는 것입니다.

0

문자열의 변경 및 복사에는 메모리 관리가 수반되는 경향이 있습니다.

메모리 관리는 성능이 좋지 않습니다. 메모리 관리는 코드 배율을 여러 코어에 잘못 적용시키는 일종의 전역 뮤텍스를 요구하기 때문입니다.

2

는 개체의 새 복사본을 자바의 모든 시간을 만들고 이후 당신이 Spolsky 조엘 기사 읽고 싶은 StringBuffer를

구문

StringBuffer strBuff=new StringBuffer(); 
strBuff.append("StringBuffer"); 
strBuff.append("is"); 
strBuff.append("more"); 
strBuff.append("economical"); 
strBuff.append("than"); 
strBuff.append("String"); 
String string=strBuff.tostring(); 
+4

자동으로 추가 된 단어 사이에 공백을 넣을 수 있습니까? : P – liori

+0

@liori ... LOL! :) –

+0

사람은 8 년 만에 업데이트되었습니다. StringBuilder를 사용하고 물론 단어 사이의 공백을 사용하십시오 – Harish

0

를 사용하는 것이 좋습니다 :

http://www.joelonsoftware.com/articles/fog0000000319.html

나, 실망했다. NET에는 F***edString이라는 기본 유형이 없다.

+0

롤. JCCyC 링크를 가져 주셔서 감사합니다. 포드 캐스트의 문자열에 대한 Joel의 호언 장담이 내 질문의 원인입니다. –

1

가변 문자열, 변경 불가능한 문자열 및 ropes을 살펴보고 저수준 언어 (예 : C)로 일반적인 조작을 구현하는 방법에 대해 생각해보십시오. 고려 :

  1. 연결.
  2. 슬라이스.
  3. 색인에서 문자 가져 오기.
  4. 색인에서 문자 변경.
  5. 문자 색인 찾기.
  6. 문자열을 순회하는 중입니다.

이러한 상황에 대한 알고리즘을 사용하면 각 유형의 저장 장치가 적절한시기를 느낄 수 있습니다.

2

많은 요점이 잘 반영됩니다. 분리 된 경우 문자열에서 8 바이트를 비교하기 위해 64 비트 int를 사용하는 것과 같은 일을 속이거나 할 수는 있지만 작업을 최적화 할 수있는 일반화 된 사례는 많지 않습니다. 숫자 길이 필드가있는 "파스칼 스타일"문자열을 사용하는 경우 길이가 같지 않으면 문자열의 나머지 부분 만 검사하기 위해 논리를 단락시킬 수 있습니다. 다른 작업에서는 대개 문자를 한 번에 한 바이트 씩 처리하거나 문자를 사용할 때 완전히 복사해야합니다. 즉 concatenation => 문자열 1의 길이를 얻고, 문자열 2의 길이를 가져오고, 할당 된 메모리, 문자열 1 복사, 문자열 2 복사. libary 문자열의 DMA 컨트롤러를 사용하여 이와 같은 작업을 수행 할 수 있지만 작은 문자열을 설정하면 이점보다 중요합니다.

피트

+0

차고에가는 동안 나는 이것에 대해 생각하고있었습니다. 일반적으로 CPU 공급 업체가 최적화하는 연산은 수학적이거나 수학의 특정 분야입니다. 예는 시뮬레이션 또는 그래픽을위한 DSP 또는 3D 매트릭스 연산입니다. CPU가 캐시 조작과 DMA 체계의 조합을 사용하여 문자열 조작에 최적화되지 않아도되는 이유는 없지만 단지 공급 업체가 문자열 조작을 최적화하도록 강요하는 업계의 압력만으로는 충분하지 않았습니다. – NoMoreZealots

관련 문제