Как я пишу (тестируют) код, который не будет оптимизирован компилятором/JIT?

Пожалуйста, попробуйте что-то вроде:

awk -F, '{
    x=$1;
    if (!shown[x,$10]++)
        ctry[x]=ctry[x]$10"%%% ";
    if (!shown[x,$6]++)
        nation[x]=nation[x]$6"%%% ";
    a[x]=$1","$2","$3","$4","$5
    b[x]=$7","$8","$9
}
END{
    for(x in a){
        gsub (/%%% $/,"",nation[x]);
        gsub (/%%% $/,"",ctry[x]);
        print a[x]","nation[x]","b[x]","ctry[x]"\n";
    }
}' list.csv > final.csv

Вы увидите, что приведенный выше скрипт основан на сценарии OP с некоторыми реорганизациями и модификациями. Пункт - линия: if (!shown[x,$10]++) и следующая подобная, которая избегает дублирования.

10
задан Hosam Aly 21 May 2013 в 19:19
поделиться

6 ответов

Не волнуйтесь об этом. Не позволяется когда-либо оптимизировать что-либо, что может иметь значение к Вашей системе (за исключением скорости). Если Вы новый объект, код называют, память выделяется, это должно работать.

Если бы Вам защитили его, если (ложь), где ложь является финалом, она могла быть оптимизирована из системы полностью, то это могло обнаружить, что метод ничего не делает и оптимизирует IT (в теории).

Править: между прочим, может также быть достаточно умно решить что этот метод:

newIfTrue(boolean b) {
    if(b)
        new ThisClass();
}

ничего не будет всегда делать, если b будет ложью, и в конечном счете выясните, что однажды в Вашем коде B всегда является ложью, и скомпилируйте эту стандартную программу из того кода полностью.

Это - то, где JIT может сделать материал, это фактически невозможно на любом неуправляемом языке.

6
ответ дан 3 December 2019 в 22:02
поделиться

Думайте об этом этот путь:

Позволяет предполагают, что компилятор может решить, что граф вызовов не имеет никаких побочных эффектов (я не думаю, что это возможно, я неопределенно помню что-то о P=NP от моих курсов CS). Это оптимизирует любой метод, который не имеет побочных эффектов. Так как большинство тестов не имеет и не должно иметь никаких побочных эффектов затем, компилятор может оптимизировать их всех далеко.

2
ответ дан 3 December 2019 в 22:02
поделиться

Я думаю, волнуетесь ли Вы по поводу этого оптимизируемый далеко, можно делать немного излишества тестирования.

На статическом языке я склонен думать о компиляторе как о тесте. Если это передает компиляцию, которая означает, что определенные вещи там (как методы). Если у Вас нет другого теста, который осуществляет Вашего конструктора по умолчанию (который докажет его, привычка выдает исключения), можно хотеть думать о том, почему Вы пишете что конструктор по умолчанию во-первых (YAGNI и все это).

Я знаю, что существуют люди, которые не соглашаются со мной, но я чувствую, что этот вид вещи - просто что-то, что чрезмерно увеличит размер Вашего количества тестов ни по какой полезной причине, даже смотря на него через защитные очки TDD.

5
ответ дан 3 December 2019 в 22:02
поделиться

Почему это должно иметь значение? Если компилятор/JIT может статически определить, не утверждает, будут пораженными (который мог бы вызвать побочные эффекты), то Вы в порядке.

0
ответ дан 3 December 2019 в 22:02
поделиться

Кажется, что в C# я мог сделать это:

[Test]
public void testDefaultConstructor() {
    GC.KeepAlive(new MyObject());
}

AFAIU, GC.KeepAlive метод не будет встроен JIT, таким образом, код, как будут гарантировать, будет работать как ожидалось. Однако я не знаю подобную конструкцию в Java.

1
ответ дан 3 December 2019 в 22:02
поделиться

Каждый ввод-вывод является побочным эффектом, таким образом, можно просто поместить

Object obj = new MyObject();
System.out.println(obj.toString());

и Вы в порядке.

0
ответ дан 3 December 2019 в 22:02
поделиться