08-Dec-2014 00:36, John Colvin пишет:
On Sunday, 7 December 2014 at 19:56:49 UTC, Dmitry Olshansky wrote:
06-Dec-2014 18:33, H. S. Teoh via Digitalmars-d пишет:
On Sat, Dec 06, 2014 at 03:26:08PM +0000, Russel Winder via
Digitalmars-d wrote:
[...]
   primitive are passed by value; arrays and user defined types are
passed by reference only (killing memory usage)

Primitive types are scheduled for removal, leaving only reference
types.
[...]

Whoa. So they're basically going to rely on JIT to convert those boxed
Integers into hardware ints for performance?

With great success.

Sounds like I will never
consider Java for computation-heavy tasks then...

Interestingly working with JVM for the last 2 years the only problem
I've found is memory usage overhead of collections and non-trivial
objects. In my tests performance of simple numeric code was actually
better with Scala (not even plain Java) then with D (LDC), for instance.

Got an example? I'd be interested to see a numerical-code example where
the JVM can beat the llvm/gcc backends on a real calculation (even if
it's a small one).

It was trivial Gaussian integration.
http://en.wikipedia.org/wiki/Gaussian_quadrature

I do not claim code is optimal or anything, but it's line for line.

// D version
import std.algorithm, std.stdio, std.datetime;

auto integrate(double function(double) f, double a, double b, int n){
    auto step = (b-a)/n;
    auto sum = 0.0;
    auto x = a;
    while(x<b)
    {
        sum += (f(x) + f(x+step))*step/2;
        x += step;
    }
    return sum;
}

long timeIt(){
    StopWatch sw;
    sw.start();
    auto r = integrate(x => x*x*x, 0.0, 1.0, 1000000);
    sw.stop();
    return sw.peek().usecs;
}

void main(){
    auto estimate = timeIt;
    foreach(_; 0..1000)
        estimate = min(estimate, timeIt);
    writef("%s sec\n", estimate/1e6);
}


// Scala version

def integrate(f: Double => Double, a: Double, b: Double, n : Int): Double = {
    val step = (b-a)/n;
    var sum = 0.0;
    var x = a;
    while(x<b)
    {
        sum += (f(x) + f(x+step))*step/2;
        x += step;
    }
    sum
}

def timeIt() = {
    val start = System.nanoTime();
    val r = integrate(x => x*x*x, 0.0, 1.0, 1000000);
    val end = System.nanoTime();
    end - start
}

var estimate = timeIt;
for ( _ <- 1 to 1000 )
    estimate = Math.min(estimate, timeIt)
printf("%s sec\n", estimate/1e9);



--
Dmitry Olshansky

Reply via email to