아래 코드는 곱셈을 수행하는 데 매우 비효율적 인 알고리즘입니다. 그것은 시험 목적으로 쓰여졌다. 나는 다른 언어로 같은 코드를 썼다고 믿는다.Java는 C보다 2 배 이상 빠릅니다 (C++의 하위 집합)
바로 아래는 코드를 실행 한 결과입니다.
OS: Windows 7
language: C (as a subset of C++)
compiler: Visual C++
optimization option: /Ox /Oi /Ot /Oy /GL
running time (seconds): 40 +/- 1
compiler: MinGW/gcc
optimization option: -O3 march=native
running time (seconds): 81 +/- 1
compiler: MinGW/g++
optimization option: -O3 march=native
running time (seconds): 82 +/- 1
language: Java
compiler: Oracle JDK
VM: Oracle JVM
running time (seconds): 18 +/- 1
나는 완전한 최적화를 갖춘 컴파일러가 최적화를 할 수 없다는 것을 내 C 코드에서 끔찍한 짓을 저질렀다고 생각한다. 큰 문제가 있으면 알려주세요. 나는 많은 양의 계산을 다루는 부분을 가진 프로젝트를 계획 중이다. C에서이 핵심 계산 부분을 작성하기로 결정했으나 이런 종류의 결과로 모든 것을 Java로 작성할 수 있습니다. 훨씬 더 쉽고 빠릅니다. 나는 아직도 C를 믿는다. 그래서 내 코드에 문제가 있다면 알려줘. 내가 기대하는 것은 자바 버전이 1.5 배 이상 느리게해야한다고했지만, 어떻게 든 C.
TEST.C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef signed char byte;
typedef struct _Array
{
byte *data;
int len;
}
Array;
void new_Array(Array *a, int len)
{
a->data = (byte *)malloc(len * sizeof(byte));
a->len = len;
}
void del_Array(Array *a)
{
free(a->data);
}
typedef struct _BUI
{
Array num;
int len;
}
BUI[1];
void new_BUI(BUI b, const char *s)
{
int len = strlen(s);
b->len = len;
new_Array(&b->num, len);
for (int i = 0; i < len; ++i)
{
b->num.data[i] = s[len - i - 1] - '0';
}
}
void del_BUI(BUI b)
{
del_Array(&b->num);
}
int BUI_cmp(const BUI a, const BUI b)
{
if (a->len > b->len)
{
return 1;
}
if (a->len < b->len)
{
return -1;
}
for (int i = a->len - 1; i >= 0; --i)
{
if (a->num.data[i] > b->num.data[i])
{
return 1;
}
if (a->num.data[i] < b->num.data[i])
{
return -1;
}
}
return 0;
}
#define MAX(A, B) (A > B ? A : B)
void BUI_add(BUI r, const BUI a, const BUI b)
{
Array c;
new_Array(&c, MAX(a->len, b->len) + 1);
memset(c.data, 0, c.len);
memcpy(c.data, a->num.data, a->len);
for (int i = 0; i < b->len; ++i)
{
c.data[i] += b->num.data[i];
}
for (int i = 0; i < c.len - 1; ++i)
{
if (c.data[i] >= 10)
{
c.data[i + 1] += c.data[i]/10;
c.data[i] %= 10;
}
}
del_Array(&r->num);
r->num = c;
r->len = c.len;
for (int i = r->num.len - 1; r->num.data[i--] == 0; --r->len);
}
void BUI_mul(BUI r, const BUI a, const BUI b)
{
BUI c;
new_BUI(c, "0");
{
BUI one;
new_BUI(one, "1");
BUI i;
new_BUI(i, "0");
for (; BUI_cmp(i, a) < 0; BUI_add(i, i, one))
{
BUI_add(c, c, b);
}
del_BUI(one);
del_BUI(i);
}
del_Array(&r->num);
r->num = c->num;
r->len = c->len;
}
void BUI_print(BUI b)
{
for (int i = b->len - 1; i >= 0; --i)
{
putchar(b->num.data[i] + '0');
}
}
int main(void)
{
BUI a;
new_BUI(a, "123456789");
BUI b;
new_BUI(b, "987654321");
BUI_print(a);
fputs(" x ", stdout);
BUI_print(b);
fputs(" = ", stdout);
time_t start_time = clock();
BUI_mul(a, a, b);
time_t end_time = clock();
BUI_print(a);
del_BUI(a);
del_BUI(b);
printf("\nelapsed time: %.3f\n", (double)(end_time - start_time)/CLOCKS_PER_SEC);
printf("%d %d\n", a->num.len, a->len);
return 0;
}
Test.java
import java.util.*;
class BUI
{
byte[] num;
int len;
BUI(String s)
{
len = s.length();
num = new byte[len];
for (int i = 0; i < len; ++i)
{
num[i] = (byte)Character.getNumericValue(s.charAt(len - i - 1));
}
}
int cmp(BUI b)
{
if (len > b.len)
{
return 1;
}
if (len < b.len)
{
return -1;
}
for (int i = len - 1; i >= 0; --i)
{
if (num[i] > b.num[i])
{
return 1;
}
if (num[i] < b.num[i])
{
return -1;
}
}
return 0;
}
void add(BUI a, BUI b)
{
byte[] c = new byte[Math.max(a.len, b.len) + 1];
Arrays.fill(c, (byte)0);
System.arraycopy(a.num, 0, c, 0, a.num.length);
for (int i = 0; i < b.len; ++i)
{
c[i] += b.num[i];
}
for (int i = 0; i < c.length - 1; ++i)
{
if (c[i] >= 10)
{
c[i + 1] += c[i]/10;
c[i] %= 10;
}
}
num = c;
len = c.length;
for (int i = num.length - 1; num[i--] == 0; --len);
}
void mul(BUI a, BUI b)
{
BUI c = new BUI("0");
{
BUI one = new BUI("1");
BUI i = new BUI("0");
for (; i.cmp(a) < 0; i.add(i, one))
{
c.add(c, b);
}
}
num = c.num;
len = c.len;
}
void print()
{
for (int i = len - 1; i >= 0; --i)
{
System.out.print(num[i]);
}
}
}
public class Test
{
public static void main(String[] args)
{
BUI a = new BUI("123456789");
BUI b = new BUI("987654321");
a.print();
System.out.print(" x ");
b.print();
System.out.print(" = ");
long start_time = System.currentTimeMillis();
a.mul(a, b);
long end_time = System.currentTimeMillis();
a.print();
System.out.printf("\nelapsed time: %.3f\n", (end_time - start_time)/1000.0);
}
}
설명은 확장 토론이 아닙니다. 이 대화는 [채팅으로 이동되었습니다] (http://chat.stackoverflow.com/rooms/65295/discussion-on-question-by-xiver77-java-is-2-times-faster-than-c-as- a-subset-of). –