# MindSpore 静态图网络编译使用Select算子优化编译性能

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): Ascend/GPU/CPU

软件环境: MindSpore 版本: 2.2.10

执行模式（静态图/动态图）： 不限

Python 版本: 3.8

操作系统平台: linux

**2. 静态图网络编译性能优化的前因**

静态图的特点是将计算图的构建和实际计算分开， 也就是编译和运行分开。在构建阶段，根据完整的计算流程对原始的计算图进行优化和调整，编译得到更省内存和计算量更少的计算图。由于编译之后图的结构不再改变，所以称之为 “静态图”。

**3. 静态图网络编译性能优化的方法**

1. 使用HyperMap优化编译性能

2. 使用Select算子优化编译性能

3. 使用编译缓存优化编译性能

4. 使用vmap优化编译性能

**4. Select算子优化编译性能**

在mindspore中，if若是进入控制流，那么每个if都会产生额外的子图，在静态图模式下，子图数量越多，编译耗时越久

而if在网络编写的时候，又是一个常用的语句。在mindspore中，可以用Select等价替换if语句来优化编译性能。虽然Select的编译耗时比if控制流少，但是Select会同时执行true分支和false分支，所以Select的运行耗时比if控制流多。当分支中算子数量较少， 建议使用Select算子。 若是较多，则推荐使用if控制流。

示例代码如下：

```
import time
from mindspore import ops
import mindspore as ms

@ms.jit
def if_net(x, y):
    out = 0
    for _ in range(100):
        if x < y:
            x = x - y
        else:
            x = x + y
        out = out + x
    return out

start_time = time.time()
out = if_net(ms.Tensor([0]), ms.Tensor([1]))
end_time = time.time()
print("if net cost time:", end_time - start_time)

@ms.jit
def select_net(x, y):
    out = x
    for _ in range(100):
        cond = x < y
        x = ops.select(cond, x - y, x + y)
        out = out + x
    return out

start_time = time.time()
out = select_net(ms.Tensor([0]), ms.Tensor([1]))
end_time = time.time()
print("select net cost time:", end_time - start_time)
```

![](figures/zh-cn_image_0000002143550461.png)

上面的示例中， 算子较少，执行完成时间相比较而言，使用Select的运行耗时比较少，所以使用select能优化性能。

