美文网首页性能优化程序员
代码优化的一点总结

代码优化的一点总结

作者: 码匠安徒生 | 来源:发表于2018-04-23 19:36 被阅读116次

很多时候,为了赶项目进度,或是没有合适的代码review机制,再是每个程序员的水平高低各不相同。以下几点就是最近优化接口时做的一些调整。

  1. 如果使用循环不停地去操作数据库,请把这个循环放在service层中,并且使用@Transactional,这样,就保证多次的数据库操作在一个事务中,不会不断地开启提交事务。不建议要放在controller层或action层中。
    举例代码如下:
    @Transactional
    @Override
    public List<Content> collectContents(Set<String> contentIds) {
        if (contentIds.isEmpty()) {
            return new ArrayList<>();
        }

        Integer[] ids = contentIds.stream()
                .map(id -> Integer.parseInt(id))
                .collect(Collectors.toList())
                .toArray(new Integer[contentIds.size()]);

        return dao.queryContentsInOne(ids);
    }
  1. 如果需要获取redis的多个keys或批量操作时,推荐使用pipeline,减少网络通讯开销。
    举例代码如下:
Pipeline pipeline = jedis.pipelined();

        List<String> uIds = new LinkedList<>(followingUsers);
        for(String userId : uIds) {
            pipeline.exists(getFormatKeyStr(USER_CONTENT_ZSET, userId));
        }
Pipeline zaddPipeline = jedis.pipelined();
        if(Objects.nonNull(followingUpUserContents) && followingUpUserContents.size() > 0) {
            followingUpUserContents.forEach(content -> {
                zaddPipeline.zadd(getFormatKeyStr(USER_CONTENT_ZSET, content.getUser().getId()),
                        content.getSortDate().getTime(),
                        String.valueOf(content.getId()));
            });

            zaddPipeline.sync();
        }
  1. 熟悉数据表的定义结构,每个字段的类型和长度,以及建立了哪些索引,哪些索引是必需的,哪些是可以去掉的,再是使用explain命令,来查看你要编写的sql语句是否使用了索引。

  2. 在项目中遇到了OOM溢出,原因是原来Hibernate使用redis作为二级缓存,后因为redis需要大量的网络通信,后更换为Ehcache,结果就OOM了。其原因是Ehcache需要大量内存缓存查询结果,一开始分配的内存并不多。解决办法,增加内存。

  3. 时刻记得null 和为空的情况,可以使用Optional来解决。
    举例代码如下:

package crazy;

import java.util.Optional;

class Company {
    private String name;
    private Optional<Office> office;

    public Company(String name, Optional<Office> office) {
        this.name = name;
        this.office = office;
    }

    public String getName() {
        return name;
    }

    public Optional<Office> getOffice() {
        return office;
    }
}

class Office {
    private String id;
    private Optional<Address> address;

    public Office(String id, Optional<Address> address) {
        this.id = id;
        this.address = address;
    }

    public String getId() {
        return id;
    }

    public Optional<Address> getAddress() {
        return address;
    }
}

class Address {
    private Optional<String> street;
    private Optional<String> city;

    public Address(Optional<String> street, Optional<String> city) {
        this.street = street;
        this.city = city;
    }

    public Optional<String> getStreet() {
        return street;
    }

    public Optional<String> getCity() {
        return city;
    }
}

public class OptionalDemo1 {

    public static void main(String[] args) {
        Optional<Address> address1 = Optional.of(new Address(Optional.ofNullable(null), Optional.of("New York")));
        Optional<Office> office1 = Optional.of(new Office("OF1", address1));
        Optional<Company> company1 = Optional.of(new Company("Door Never Closed", office1));

        // What is the street address of company1?
        // In which city company1 is located?
        Optional<Office> maybeOffice = company1.flatMap(Company::getOffice);
        Optional<Address> maybeAddress = office1.flatMap(Office::getAddress);
        Optional<String> maybeStreet = address1.flatMap(Address::getStreet);

        maybeStreet.ifPresent(System.out::println);
        if (maybeStreet.isPresent()) {
            System.out.println(maybeStreet.get());
        } else {
            System.out.println("Street not found.");
        }
        
        // shorter way
        String city = company1.flatMap(Company::getOffice)
                .flatMap(Office::getAddress)
                .flatMap(Address::getStreet)
                .orElse("City is not found.");
        
        System.out.println("City: " + city);
        
         // only print if city is not null
        company1.flatMap(Company::getOffice)
                .flatMap(Office::getAddress)
                .flatMap(Address::getCity)
                .ifPresent(System.out::println);

    }
}
  1. 如果常见的优化手段并不明显,可以考虑使用临时表。

最重要的一点是:
写代码的时候,不要只盯着代码,要想你写的代码在内存或是在程序中是如何执行的。

相关文章

  • 代码优化的一点总结

    很多时候,为了赶项目进度,或是没有合适的代码review机制,再是每个程序员的水平高低各不相同。以下几点就是最近优...

  • jvm原理

    35 个 Java 代码性能优化总结 优化代码可以减小代码的体积,提高代码运行的效率。从 JVM 内存模型谈线程安...

  • 一次代码优化实践,用了模板方法+策略+工厂方法模式

    前言 今天来一份代码优化总结。用模板方法+策略+工厂方法模式优化了代码,耐心点看完,应该对大家有帮助的~ 优化代码...

  • 项目代码重构

    总结问题,代码结构优化,业务逻辑优化,同时实现日志格式化... 代码优化建议 代码长度和宽度 屏幕一页能完整展示一...

  • 代码优化总结

    目录 代码优化的引出 代码优化的目标 代码优化细节(1)尽量指定类、方法的final修饰符(2)尽量重用对象(3)...

  • 常见性能优化实践总结

    常见性能优化实践总结 一:代码 这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,言必称缓存...

  • iOS 性能优化

    参考文章 微信读书 iOS 性能优化总结 iOS性能优化 iOS 启动连续闪退保护方案 iOS代码性能优化《阶级篇...

  • 操作抽象设计-实践

    前言 最近在做程序优化和代码总结的工作,在优化和总结的过程中发现,程序中存在着许多重复性的交互代码,特别是在业务逻...

  • java代码优化总结

    上次面试的时候,免面试官问我java代码优化,虽然平时在实际开发中也有注意这方面的问题,但当时就是没回来上来,都怪...

  • 代码存在大量的if/else优化方案总结

    过多的else if 会使代码臃肿而简陋,下面是优化方案总结 一、多个else if分支优化 1.Key-valu...

网友评论

    本文标题:代码优化的一点总结

    本文链接:https://www.haomeiwen.com/subject/pdollftx.html